相关疑难解决方法(0)

将 SwiftUI 按钮绑定到 AnySubscriber,就像 RxCocoa 的按钮点击一样

我使用以下UIViewController基于RxSwift/RxCocoa的代码编写一个非常简单的 MVVM 模式来绑定UIButton点击事件以触发一些Observable工作并侦听结果:

import UIKit
import RxSwift
import RxCocoa

class ViewController: UIViewController {

    @IBOutlet weak var someButton: UIButton!

    var viewModel: ViewModel!
    private var disposeBag = DisposeBag()

    override func viewDidLoad() {
        super.viewDidLoad()
        viewModel = ViewModel()
        setupBindings()
    }

    private func setupBindings() {
        someButton.rx.tap
        .bind(to: self.viewModel.input.trigger)
        .disposed(by: disposeBag)

        viewModel.output.result
            .subscribe(onNext: { element in
            print("element is \(element)")
            }).disposed(by: disposeBag)
    }
}

class ViewModel {

    struct Input {
        let trigger: AnyObserver<Void>
    }

    struct Output {
        let result: …
Run Code Online (Sandbox Code Playgroud)

ios rx-swift rx-cocoa swiftui combine

7
推荐指数
1
解决办法
5064
查看次数

Swift Combine:在可观察对象中使用计时器发布者

在这个问题被标记为另一个问题的重复之前,我试图了解发布者的工作方式,因为它以我不期望的方式行事。

使用与前面提到的问题的答案相同的示例:

// Let's define the view model with my view...
import Combine
import SwiftUI

class TimerViewModel: ObservableObject {
  private let cancellable: AnyCancellable?

  let intervalPublisher = Timer.TimerPublisher(
                            interval: 1.0, 
                            runLoop: .main, 
                            mode: .default)

  init() {
    self.cancellable = timerPublisher.connect() as? AnyCancellable
  }

  deinit {
    self.cancellable?.cancel()
  }
}

struct Clock : View {
  @EnvironmentObject var viewModel: TimerViewModel
  @State private var currentTime: String = "Initial"


  var body: some View {
    VStack {
      Text(currentTime)
    }
    .onReceive(timer.intervalPublisher) { newTime in
      self.currentTime = String(describing: …
Run Code Online (Sandbox Code Playgroud)

xcode swift swiftui xcode11 combine

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

标签 统计

combine ×2

swiftui ×2

ios ×1

rx-cocoa ×1

rx-swift ×1

swift ×1

xcode ×1

xcode11 ×1