子类UIStackView以ack作为观察者

时间:2018-01-04 17:31:48

标签: ios swift rx-swift

我想将UIStackView子类化为可观察的,我可以将观察者绑定到它。基本上我想传递一个观察者,并且我希望将每个元素添加到堆栈中。 所以基本上我会var myObs: Observable<CanBeDisplayInMyStackViewType>,我想做myObs.bind(to: myCustomStackView)并为每个元素添加一个子视图。

这是我到目前为止所尝试的:

protocol CanBeDisplayInMyStackViewType {
    var title: String { get }
}

class CustomStackViewUIStackView<E>: UIStackView, ObserverType where E:CanBeDisplayInMyStackViewType  {
    typealias E = CanBeDisplayInMyStackViewType

    func on(_ event: Event<CanBeDisplayInMyStackViewType>) {
        switch event {
        case .next(let value): nextElement(value)
        case .completed: break
        case .error(_): break
        }
    }

    func nextElement(e: CanBeDisplayInMyStackViewType) {
        let someViewForStack = SomeViewForStack.init(e: e)
        self.insertSubview(someViewForStack, at: 0)
    }

    class SomeViewForStack: UIView {
        init(e: CanBeDisplayInMyStackViewType) {}
        required init?(coder aDecoder: NSCoder) {}
    }
}

但导致错误:无法专门化非泛型类型'事件' enter image description here

1 个答案:

答案 0 :(得分:1)

我刚刚重构了一些代码以便更好地理解。问题就消失了。代码编译。

顺便说一句,请指定您使用的 Swift RxSwift 的版本。

无论如何,提供重构的代码,它可能会有所帮助:

protocol CanBeDisplayInMyStackViewType {

    var title: String { get }
}

class CustomStackViewUIStackView<Element>: UIStackView, ObserverType where Element: CanBeDisplayInMyStackViewType  {

    func on(_ event: Event<Element>) {
        switch event {
        case .next(let element):
            nextElement(element: element)
        case .completed:
            break
        case .error:
            break
        }
    }

    func nextElement(element: CanBeDisplayInMyStackViewType) {
        let view = SomeViewForStack(element: element)
        self.insertSubview(view, at: 0)
    }

    class SomeViewForStack: UIView {

        init(element: CanBeDisplayInMyStackViewType) {
            super.init(frame: .zero)
        }

        required init?(coder aDecoder: NSCoder) {
            super.init(frame: .zero)
        }
    }
}