ios - 无法在 UIStackview 响应式(Reactive)和声明式 swift 中转换类型的值

标签 ios swift rx-swift

我正在尝试使 UIStackview 具有反应性和声明性,正如我在此处的问题中所回答的那样 setting ids on item in Stackview但我现在遇到的问题是,当我尝试绑定(bind)到 stackView 时,出现此错误 Cannot convert value of type '(_) -> (@escaping (Int, _.Element, UIView?) -> UIView) -> Disposable' to expected argument type '(Observable<[LandMarkData]?>) -> (_) -> _'

下面是我使用的代码

extension Reactive where Base: UIStackView {

    func items<Sequence: Swift.Sequence, Source: ObservableType>(_ source: Source) -> (_ viewForRow: @escaping (Int, Sequence.Element, UIView?) -> UIView) -> Disposable where Source.E == Sequence {
        return { viewForRow in
            return source.subscribe { event in
                switch event {
                case .next(let values):
                    let views = self.base.arrangedSubviews
                    let viewsCount = views.count
                    var valuesCount = 0
                    for (index, value) in values.enumerated() {
                        if index < viewsCount {
                            // update views that already exist
                            _ = viewForRow(index, value, views[index])
                        }
                        else {
                            // add new views if needed
                            let view = viewForRow(index, value, nil)
                            self.base.addArrangedSubview(view)
                        }
                        valuesCount = index
                    }
                    if valuesCount + 1 < viewsCount {
                        for index in valuesCount + 1 ..< viewsCount {
                            // remove extra views if necessary
                            self.base.removeArrangedSubview(views[index])
                            views[index].removeFromSuperview()
                        }
                    }
                case .error(let error):
                    fatalError("Errors can't be allowed: \(error)")
                case .completed:
                    break
                }
            }
        }
    }
}

在我的 View Controller 中

var features: [LandMarkData] = [LandMarkData]()
var selectedFeatures: [LandMarkData] = [LandMarkData]()

    let stackFeature = UIStackView()
    var stv: CheckboxStackView?
    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = .white
        hideKeyboardWhenTappedAround()
        layout()
        logic()
        tableViewInit()

        self.stackFeature.axis = .vertical
        self.stackFeature.distribution = .fill
        self.stackFeature.spacing = 8

        let featured = NetworkAdapter.instance.getFeaturesAmeneities()
            .map { $0.data }
            .share(replay: 1)

        featured
            .bind(onNext: { [weak self] in self?.features.append(contentsOf: $0!) })
            .disposed(by: disposeBag)


        featured
            .bind(to: stackFeature.rx.items) { (row, element, view) in
                let myView = (view as? CheckboxStackView) ?? CheckboxStackView()

                myView.label.text = element.name
                myView.checkBox.tag = element.id ?? 0
                return myView
            }
            .disposed(by: disposeBag)

    }

对我收到错误的任何帮助和修复表示赞赏

最佳答案

问题是您在需要数组的地方传递了一个可选数组。

关于ios - 无法在 UIStackview 响应式(Reactive)和声明式 swift 中转换类型的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57655773/

相关文章:

Swift 如何在 paymentQueueRestoreCompletedTransactionsFinished 中显示警报?

swift 4 "Extra argument in call"Rxswift

iOS Rxswift 处理 CancelButton 在 searchBar 中点击

ios - 当参与者快速加入时,不会调用 ooVooAVChatDelegate

ios - Swift NotificationCenter 删除观察者最快的方法

ios - 在 Storyboard之外创建一个 View Controller

ios - 我可以在 iOS 应用程序中使用 .jar 文件吗?

ios - RxSwift - UIImageView - 观察属性 isHighlighted

ios - self.delegate 总是 nil

iphone - 自定义 UIButton/图像选择器内存问题