ios - 将 UIStackView 子类化为观察者

标签 ios swift rx-swift

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

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

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

最佳答案

为了更好地理解,我刚刚对您的代码进行了一些重构。问题消失了。代码编译。

顺便说一句,指定您使用的 SwiftRxSwift 的版本。

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

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

关于ios - 将 UIStackView 子类化为观察者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48100589/

相关文章:

javascript - 响应式设计适用于桌面浏览器、移动模拟器(Safari 和 Mozilla Firefox),但不适用于真正的智能手机(Android、iOS)

iphone - 单击自定义按钮时如何通过@selector 传递数据?

ios - 我需要在 Nib 之间使用自定义转场

ios - 使用 Swift 中的 Parse 进行 FB 登录的用户持久性

ios - 带有 nil 包装的自定义 flatMapLatest

ios - DispatchQueue.main.async如何存储它的 block

ios - 带有 ObjC 静态库的私有(private) Swift Pod

ios - 如何使用包含具有某些布局的 ZStack 的 navigationLink 导航到详细信息屏幕

ios - 这个函数语法是什么意思?

ios - 如何动画从 TableView (rxswift)中删除单元格?