RxSwift和AlertAction

RxSwift和AlertAction,swift,rx-swift,uialertaction,Swift,Rx Swift,Uialertaction,我有一个带有UIAlertAction的Tableview。当我按下一个单元格时,会出现一个弹出窗口,然后我可以决定执行哪个操作。在Ok操作(单击按钮)期间,我希望观察单元格的数据并在ViewModel中接收它。但也存在一些问题。 当我第一次按下时,没有任何值,如果我只单击一个单元格,数据仍将发送到ViewModel。如果单击更多UIAlertAction弹出窗口,则发送的数据将增加。例如:第一次单击-无,第二次单击-值1,第三次单击值1,1,1等等。 如何从UIAlertAction弹出窗口的

我有一个带有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", style: .default, 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:")
            
}
let stationItem=PublishSubject()
func addStationItem(){
stationItem.subscribe(onNext:{(数据)在
打印(“数据:\(数据)”)
})
.处置(由:处置人)
打印(“添加:”)
}

问题在于您对所选型号的追溯订阅。请记住,每次调用函数时,都会得到一个新的可观察值。从订阅的那一刻起,无论何时点击某个内容,它都会告诉您,但不会告诉您上一次点击的情况,即导致警报首先出现的那一次

这里要做的第一件事是创建一个可重用的函数,让您可以创建和显示警报视图。无论何时,只要您想向用户请求某些内容,请使用这种模式:

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
    }
}

你在这里做的看起来很像。您可能会发现阅读更多关于它的内容很有启发性。

这是一个非常令人惊讶的解决方案。非常感谢你!实际上,您可以设置这样的系统来显示所有视图控制器,而不仅仅是警报。实现此目的的工具如下:@初学者992如果你觉得答案有用,你应该接受它。完成!对不起,再一次谢谢你的帮助。
final class ViewModel {
    let stationItems = PublishSubject<[StationItem]>()

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

    func fetchStations() { 
        // do your fetching and load `stationItems`.
    }
}
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)