我想将 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) {}
}
}
最佳答案
为了更好地理解,我刚刚对您的代码进行了一些重构。问题消失了。代码编译。
顺便说一句,指定您使用的 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)
}
}
}
关于ios - 将 UIStackView 子类化为观察者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48100589/