我想将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) {}
}
}
答案 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)
}
}
}