CocoaAction / 带有 UIAlertController 的操作

Posted

技术标签:

【中文标题】CocoaAction / 带有 UIAlertController 的操作【英文标题】:CocoaAction / Action with UIAlertController 【发布时间】:2016-08-23 21:09:22 【问题描述】:

我正在尝试使用 Action / CocoaAction 库。 目前的主要用途是显示 UIAlertController,当点击 UIAlertAction 按钮时,它必须调用我的 viewModel 中定义的函数(changeAddress 返回 Observable)。

我对此的理解是:

let ac = CocoaAction(workFactory: [unowned self] _ in
    self.viewModel!.requestChangeAddress()
        .subscribeNext( [unowned self] data in
            if let response = data?.result
            
                self.showResultOperation(response)
            
        )
        .addDisposableTo(self.disposeBag)
        return .empty()
    )

let OKAction = UIAlertAction.Action("OK", style: .Default)
OKAction.rx_action = ac

但不幸的是,它不起作用。 workFactory 闭包被正确调用,但订阅没有生效。当我返回 .empty 时,我知道出了点问题,但我不明白如何解决。

我该如何纠正这个问题?我做错了什么?

【问题讨论】:

【参考方案1】:

好问题!感谢您发布代码。

所以您的代码从requestChangeAddress 获取可观察对象,但随后它订阅它并将其添加到处理包中。 Action 课程实际上会为您处理这些问题,您只需退回一次性用品。

问题是你想对动作中发送的值做一些事情,而返回 observable 不会让你这样做。因此,您需要在观察者链中包含对doOnNext 的调用。下面是它的样子:

let ac = CocoaAction(workFactory: [unowned self] _ in
    return self.viewModel!
        .requestChangeAddress()
        .doOnNext( [unowned self] data in
            if let response = data?.result
            
                self.showResultOperation(response)
            
        )
        .map  _ in Void() 
)

在 RxSwift 中使用 doOn 函数是在必要时将副作用注入到 observables 中的好方法,就像这里一样。

编辑:我在最后添加了映射来修复编译器错误,因为工厂方法的返回类型是Observable<Void>

【讨论】:

谢谢,我试过这样做,但在第一行编译器给出了这个错误:“无法将类型 '()->Observable' 的值转换为类型的预期参数' -> 可观察的<_>'" 谢谢...几乎一切都好。我有一个与此相关的问题......在alertContoller中点击确定或取消后,按钮看起来像已禁用,不再触发触摸。我该如何解决这个问题?

以上是关于CocoaAction / 带有 UIAlertController 的操作的主要内容,如果未能解决你的问题,请参考以下文章

UIAlertView 显示方法与新的 UIAlertController 对象等效吗?

如何处理: UIActionSheet deprecated (iOS8) X UIAlertController not supported (iOS7)

带有多个链接的 NSAttributedString 的 UILabel,带有行限制,显示尾部截断,带有未见文本的 NSBackgroundColorAttributeName

使用带有 uuencode 的“sendmail”发送邮件,并带有主题

带有和不带有聚合的 sql 查询

如何翻转正面带有标签而背面带有另一个标签的视图 - 参见图片