【发布时间】:2021-11-01 20:55:15
【问题描述】:
我正在尝试使用 rx 操作扩展我的 KeyboardView 视图,但没有成功。根据带有断点的调试,值被传递给中继,但尽管在视图控制器中进一步订阅,但未调用扩展。可能是什么问题以及如何解决?
final class KeyboardView: UIView {
private let disposeBag = DisposeBag()
fileprivate let buttonTappedRelay = PublishRelay<ActionType>()
private let digitButtons: [KeyboardButton] = {
return stride(from: 0, through: 9, by: 1)
.compactMap { $0 }
.map { KeyboardButton(actionType: .digit($0)) }
}()
private let eraseButton: KeyboardButton = {
let button = KeyboardButton(actionType: .erase)
return button
}()
public override init(frame: CGRect) {
super.init(frame: frame)
setupViews()
setupConstraints()
setupActions()
}
private func setupViews() { ... }
private func setupConstraints() { ... }
private func setupActions() {
eraseButton.rx.buttonTap
.asObservable()
.observeOn(MainScheduler.instance)
.subscribe(onNext: { [weak self] actionType in
self?.buttonTappedRelay.accept(actionType)
}).disposed(by: self.disposeBag)
for button in digitButtons {
button.rx.buttonTap
.asObservable()
.observeOn(MainScheduler.instance)
.subscribe(onNext: { [weak self] actionType in
self?.buttonTappedRelay.accept(actionType)
}).disposed(by: self.disposeBag)
}
}
}
extension Reactive where Base: KeyboardView {
internal var buttonTap: ControlEvent<ActionType> {
return ControlEvent<ActionType>(events: base.buttonTappedRelay.asObservable() )
}
}
【问题讨论】:
-
您发布的代码中没有任何内容表明存在问题。尝试将
debug消息放入链中,看看是否可以追踪事件停止传播的位置... -
@DanielT.,我放了断点,发现 self?.buttonTappedRelay.accept(actionType) 被成功调用,同时 ControlEvent
(events: base.buttonTappedRelay.asObservable() ) 不是。虽然我在 VC 的更多代码中订阅了 buttonTap。 -
如果一个函数没有被调用,你就不能得到它的输出。您没有调用该函数。
-
@DanielT.,您能否解释一下为什么不调用它。我通过接受函数将值发送到继电器。然后我订阅了带有继电器的 Rx 扩展。我还应该在哪里称呼它?
-
这是一个基本的编程问题。为了使用函数的结果,您必须调用该函数。如果您认为您正在调用该函数,请显示发生这种情况的代码。