标签: rx-cocoa

如何在RxSwift中将UISwitch绑定到UIButton?

我有一个UISwitch需要选择,以便继续到下一个表单屏幕.所以我想将UISwitch选中的内容绑定到UIButton启用状态.我只是无法得到这个样本.

这是我正在尝试但不编译的内容:

let termsValidation = termsSwitch
    .rx_selected
    .shareReplay(1)

termsValidation
    .bindTo(signupButton.rx_enabled)
    .addDisposableTo(disposeBag)
Run Code Online (Sandbox Code Playgroud)

在RxSwift和RxCocoa中使用它的正确方法是什么?

ios swift rx-swift rx-cocoa

5
推荐指数
2
解决办法
3569
查看次数

NSTableview带有RXSwift和RxCocoa for OSX

如何使用反应框架使用数组填充NSTableview?在iOS中使用UITableview:

self.viewModel.arrayElements.asObservable()
        .observeOn(MainScheduler.instance)
        .bind(to: detailsTableView.rx.items(cellIdentifier: "comment", cellType: UITableViewCell.self)){
            (row,element,cell) in
                 cell.addSubview(cellView)
        }.addDisposableTo(disposeBag)
Run Code Online (Sandbox Code Playgroud)

我如何为NSTableView实现相同的功能

在此处输入图片说明

macos nstableview reactive-programming rx-swift rx-cocoa

5
推荐指数
1
解决办法
443
查看次数

RxSwit - 来自可观察忽略错误的驱动程序

假设我有一些视图最初填充了一些数据。比我通过网络获取数据并想用这个更新的数据更新视图。

在这一点上,我想从这个 observable 创建 Driver 来驱动 UI 元素。但是,如果 observable 出现错误,我不想做任何事情,因为视图已经有一些数据,所以我只想忽略这样的错误。asDriver() 函数想要定义在出现错误时应该做什么。这样做可以吗:

let dataUpdated: Observable<DataItem> = ...

let driver = dataUpdated.asDriver(onErrorDriveWith: Driver<DataItem>.empty())
Run Code Online (Sandbox Code Playgroud)

?

swift rx-swift rx-cocoa

4
推荐指数
1
解决办法
2383
查看次数

RxSwift - 在 UISearchBar 中以编程方式触发搜索

当用户键入一些文本时,我正在观察 UISearchBar.rx.text 属性以执行一些与搜索相关的操作。但有时,我也想以编程方式触发此搜索操作。例如,在此示例中创建视图时,不幸的是没有打印“Searching for [...]”文本。

import UIKit
import RxSwift
import RxCocoa

class ViewController: UIViewController {
  @IBOutlet weak var mySearchBar: UISearchBar!

  let disposeBag = DisposeBag()

  override func viewDidLoad() {
    super.viewDidLoad()
    // Trigger search when text changes
    mySearchBar.rx.text.subscribe(onNext: { (text)
         print("Searching for \(text)...")
         // do some search Action
    }
    .disposed(by: disposeBag)

    // Programmatically trigger a search
    mySearchBar.text = "Some text to search"
  }

}
Run Code Online (Sandbox Code Playgroud)

问题是更改 mySearchBar.text 不会触发新的 rx.text 事件。有没有办法做到这一点?

例如,感谢这篇文章,我知道有了 UITextField,这可以使用 UITextField.sendActions(for: .ValueChanged) 函数实现。UISearchBar 是否有类似的方法?

ios swift rx-swift rx-cocoa

4
推荐指数
1
解决办法
5609
查看次数

如何使用MVVM/RxSwift基于来自其他单元格的值更新tableview的单元格?

我是RxSwift的新手,并试图通过创建一个简单的注册表来学习.我想用a来实现它UITableView(作为练习,以及将来会变得更复杂)所以我目前正在使用两种类型的单元:

  • 一个TextInputTableViewCell只有一个UITextField
  • 一个ButtonTableViewCell只有一个UIButton

为了表示每个单元格,我创建了一个看起来像这样的枚举:

enum FormElement {
    case textInput(placeholder: String, text: String?)
    case button(title: String, enabled: Bool)
}
Run Code Online (Sandbox Code Playgroud)

并在a中使用它Variable来提供tableview:

    formElementsVariable = Variable<[FormElement]>([
        .textInput(placeholder: "username", text: nil),
        .textInput(placeholder: "password", text: nil),
        .textInput(placeholder: "password, again", text: nil),
        .button(title: "create account", enabled: false)
        ])
Run Code Online (Sandbox Code Playgroud)

通过这样绑定:

    formElementsVariable.asObservable()
        .bind(to: tableView.rx.items) {
            (tableView: UITableView, index: Int, element: FormElement) in
            let indexPath = IndexPath(row: index, section: 0)
            switch element {
            case .textInput(let placeholder, let defaultText):
                let cell …
Run Code Online (Sandbox Code Playgroud)

mvvm ios swift rx-swift rx-cocoa

4
推荐指数
2
解决办法
1373
查看次数

rxswift bind(onNext:VS subscription(onNext:

我有两个问题:

  1. 'bind(onNext:')和'subscribe(onNext:')之间有什么区别?
struct Info {
    var index: Int?
    var data: String?
}

let infoData: BehaviorRelay<Info> = BehaviorRelay<Info>(value: Info())
var osInfo: Observable<String> { return self.infoData.map({ return $0.data }).distinctUntilChanged() }

osInfo.bind { (target) in
    print("bind!")
    }.disposed(by: self.disposeBag)

osInfo.subscribe { (target) in
    print("subscribe!")
    }
    .disposed(by: self.disposeBag)
Run Code Online (Sandbox Code Playgroud)
  1. a没有asObservable(),但是可执行性很好。a和b的区别是什么?
a. var osInfo: Observable<String> { return self.infoData.map({ return $0.data }).distinctUntilChanged() }
b. var osInfo: Observable<String> { return self.infoData.asObservable().map({ return $0.data }).distinctUntilChanged() }

Run Code Online (Sandbox Code Playgroud)

rx-swift rx-cocoa

4
推荐指数
1
解决办法
1635
查看次数

如何实现串行网络调用队列然后在 RxSwift 中处理?

我正在开发一个应用程序,我想使用 RxSwift 和 RxCocoa 实现以下目标

  1. 将包含 url 的 JSON 下载到 X 个文件
  2. 下载文件1,处理文件1
  3. 下载文件2,处理文件2
  4. 下载文件3,处理文件3

... 等等

这里的关键是每个文件的处理必须在下载下一个文件之前完成。至少必须按顺序执行文件处理的顺序。如果我可以在处理文件 1 的同时开始下载文件 2,那就太棒了,但不是必需的。

我已经尝试使用 SerialDispatchQueueScheduler 来完成这项工作,但由于文件大小不同,每个文件的下载在不同的时间完成,因此处理代码的触发顺序与我开始下载的顺序不同。

通过使用 NSOperations 等,我可以在不使用 Rx 的情况下轻松实现这一点,但我想在这个应用程序中继续使用 Rx,因为它是我在这个应用程序的其他地方使用的。

下面我包含了一些代码片段。为了这个问题,已经添加了评论。

       .flatMap { [unowned self] (tasks: [DiffTask]) -> Observable<ApplyDiffStatus> in
            return Observable.from(tasks)
                .observeOn(self.backgroundScheduler) // StackOverflow: backgroundScheduler is a SerialDispatchQueueScheduler
                .flatMapWithIndex({ [unowned self] (task, index) in
                    return self.fetchDiff(for: task, taskIndex: index, taskCount: tasks.count) // StackOverflow: Downloads a file from a URL
                })
                .catchError({ (error) -> Observable<DictionaryUpdater.DiffTaskProgress> in
                    observable.onError(error)
                    throw error
                }) …
Run Code Online (Sandbox Code Playgroud)

swift rx-swift rx-cocoa

3
推荐指数
1
解决办法
2653
查看次数

从 UICollectionView 索引路径获取模型

我正在使用RxSwift将模型数组绑定到集合视图

如何从给定的 indexPath 获取模型对象?

我正在做这样的绑定:

vm.bikeIssueCatagories()
        .drive(self.collectionView.rx.items(cellIdentifier: "BikeIssueCategoryCollectionViewCell", cellType: UICollectionViewCell.self)) { row, data, cell in
        }.disposed(by: disposeBag)
Run Code Online (Sandbox Code Playgroud)

我的问题的核心是,我需要获取用户选择的模型对象和单元格。Using collectionView.rx.modelSelected(T.self)only 给了我模型 og type T。打电话collectionView.rx.itemSelected只给我选择的IndexPath

collectionView.rx.itemSelected.asDriver()
        .driveNext { [unowned self] indexPath in
            guard let model = try? collectionView.rx.model(at: indexPath) else { return }
            guard let cell = self.collectionView.cellForItem(at: indexPath) else { return }
        }.disposed(by: disposeBag)
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试在 indexPath 处创建模型时,这给了我一个错误:

类型“inout UICollectionView”不符合协议“ReactiveCompatible”

试试看:

let indexPath = IndexPath.init()
self.collectionView.rx.model(at: indexPath)
Run Code Online (Sandbox Code Playgroud)

也给了我一个错误:

对成员“model(at:)”的不明确引用

SO...如何获取用户选择的模型对象和单元格?

ios swift rx-swift rx-cocoa

3
推荐指数
1
解决办法
2246
查看次数

将 3 个按钮的点击事件与 rxSwift 结合起来

我有3个按钮

@IBOutlet weak var editGeomButton: UIButton! // 1
@IBOutlet weak var editDataButton: UIButton! // 2
@IBOutlet weak var deleteDataButton: UIButton! // 3
Run Code Online (Sandbox Code Playgroud)

单击任何此按钮时,我希望调用以下方法。用正确的数字。

func didTap() -> Observable<Int> {

}

didTap().subscribe(onNext: { (tag) in
    switch tag {
    case 1:
        print("Did tap Edit Geom")
    case 2:
        print("Did tap Edit Data")
    case 3:
        print("Did tap Delete geom")
    default:
        print("Invalid tap")
    }
}).disposed(by: disposeBag)
Run Code Online (Sandbox Code Playgroud)

请帮助使用 Observable 在 didTap 方法中编写代码?我认为这可以使用组合运算符来实现。但我不明白如何编码。

swift rx-swift rx-cocoa

3
推荐指数
1
解决办法
2662
查看次数

添加 `RxSwift` 包依赖项后无法构建 Swift 包:“未找到产品 'RxCocoa'”

我创建了一个新的 Swift 包并尝试使用RxSwift其中的依赖项。我按照这些说明添加依赖项,但在此之后我的包无法构建,并出现以下错误:

找不到包“mylibrary”目标“MyLibrary”所需的产品“RxCocoa”。

我的包清单在这里:

// swift-tools-version: 5.8
import PackageDescription

let package = Package(
    name: "MyLibrary",
    products: [them visible to other packages.
        .library(
            name: "MyLibrary",
            targets: ["MyLibrary"]),
    ],
    dependencies: [
        .package(url: "https://github.com/ReactiveX/RxSwift.git", .exact("6.5.0"))
    ],
    targets: [
        .target(
            name: "MyLibrary",
            dependencies: ["RxSwift", "RxCocoa"]),
        .testTarget(
            name: "MyLibraryTests",
            dependencies: ["MyLibrary"]),
    ]
)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

我在用着Xcode 14.3。我应该如何将 RxSwift 依赖项添加到包中。

xcode rx-swift swift-package-manager rx-cocoa swift-package

3
推荐指数
1
解决办法
642
查看次数