RxSwift 和 AlertAction

如何解决RxSwift 和 AlertAction

我有带有 UIAlertAction 的 Tableview。当我按下一个单元格时,会出现一个弹出窗口,然后我可以决定要执行哪个操作。在 Ok 操作(单击按钮)期间,我想观察单元格的数据并在 viewmodel 中接收它。但是也有问题。 当我第一次按下时没有任何值,如果我只是单击一个单元格,数据仍在发送到 viewmodel。如果我单击更多 UIAlertAction 弹出窗口,则发送数据会增加。例如:第一次单击 - 无,第二次单击 - 值 1,第三次单击值 1、1、1 等。 如何从 UIAlertAction 弹出窗口的第一次点击开始观察单元格以及如何仅获取数据示例?

视图控制器:

func bindTableView() {
    viewmodel.stationItems.bind(to: addTableView.rx.items(cellIdentifier: "addCell",cellType: AddTableViewCell.self)) { (row,item,cell)
        in
        cell.cellAdd = item
    }.disposed(by: disposeBag)
    
    addTableView.rx.modelSelected(StationItem.self)
        .subscribe(onNext: { item in

            let alert = UIAlertController(title: "Add Station",message: "Do you want to add a station to your favorites?",preferredStyle: .alert)
            let ok = UIAlertAction(title: "Ok",style: .default,handler: { action in
                self.addTableView.rx.modelSelected(StationItem.self)
                    .bind(to: self.viewmodel.stationItem)
                    .disposed(by: self.disposeBag)
                self.viewmodel.addStationItem()
            })
            alert.addAction(ok)
            let cancel = UIAlertAction(title: "Cancel",handler: { action in
            })
            alert.addAction(cancel)
            dispatchQueue.main.async(execute: {
                self.present(alert,animated: true)
            })
        }).disposed(by: disposeBag)
    
    viewmodel.fetchStations()
}

视图模型:

 let stationItem = PublishSubject<StationItem>()

 func addStationItem() {
    stationItem.subscribe(onNext: {(data) in
        print("Data: \(data)")
        
        })
        .disposed(by: disposeBag)
    
    print("ADD:")
            
}

解决方法

问题在于您对 modelSelected 的追溯订阅。请记住,每次调用该函数时,都会得到一个 observable。从订阅的那一刻起,它会在您点击某项内容时告诉您,但不会告诉您前一次点击,即导致警报首先出现的那个。

这里要做的第一件事是创建一个可重用的函数,让您可以创建和呈现警报视图。每当您想向用户询问某事时,请使用这种模式:

extension UIViewController {
    func presentAlert(title: String?,message: String?) -> Observable<Void> {
        let result = PublishSubject<Void>()
        let alert = UIAlertController(title: title,message: message,preferredStyle: .alert)
        let ok = UIAlertAction(title: "OK",style: .default,handler: { _ in
            result.onNext(())
            result.onCompleted()
        })
        let cancel = UIAlertAction(title: "Cancel",style: .cancel) { _ in
            result.onCompleted()
        }
        alert.addAction(ok)
        alert.addAction(cancel)
        present(alert,animated: true)
        return result
    }
}

如果您要为视图模型使用命令式输入,请一路保持一致性:

final class ViewModel {
    let stationItems = PublishSubject<[StationItem]>()

    func addStationItem(_ item: StationItem) {
        print("ADD:")
    }

    func fetchStations() { 
        // do your fetching and load `stationItems`.
    }
}

然后在你的视图控制器的绑定函数中,你可以使用一个 flatMap 来调用上面的:

addTableView.rx.modelSelected(StationItem.self)
    .flatMapFirst { [unowned self] item in
        self.presentAlert(title: "Add Station",message: "Do you want to add a station to your favorites?")
            .map { item }
    }
    .bind { [viewModel] in
        viewModel?.addStationItem($0)
    }
    .disposed(by: disposeBag)

你在这里所做的看起来很像The Binder Architecture。阅读更多相关内容可能会对您有所启发。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?