我有一个类MyContainer,它有另一个自定义类作为变量。另一个类MyInterface是一个视图控制器超类,它由另外两个子自定义类MyVCA和MyVCB扩展。这样做的原因是因为我有一个在两个屏幕上都使用的底部按钮 - 每次都必须更新内容,我以编程方式进行更新。还有一个内容管理器,我用它来知道要使用的两个子类中的哪一个,称为MyContentManager。
我遇到的问题是当我从之前的视图控制器转到MyVCA或MyVCB时,因为取决于它是哪一个,需要完成某项任务。我正在从故事板中实例化MyVCB的视图,如下所示:
let vc = UIStoryboard(name: "Containers",
bundle: Bundle.main).instantiateViewController(withIdentifier:
"my_container") as! MyContainer
vc.contentManager = MyContentManager(type: .type_my_vc_a)
vc.shouldDoTask = true
self.navigationController?.pushViewController(vc, animated: true)
可以看出,我创建了一个标志,shouldDoTask,需要在此时设置(在前一个视图控制器内)。但是因为它被设置为容器超类,所以孩子们无法访问它。所以基本上需要发生的是这个标志需要通过路径MyContainer传播 - > MyInterface - > MyVCA / MyVCB。
我试图在MyInterface中使用属性作为标志:
private var _shouldDoTask: Bool = false
var shouldDoTask: Bool {
set { _shouldDoTask = newValue }
get { return _shouldDoTask }
}
在MyContainer中:
var content: MyInterface!
var shouldDoTask: Bool {
set {
if content != nil {
content.shouldDoTask = newValue
}
}
get {
return (content != nil)
? content.shouldDoTask
: false
}
}
然后在MyVCA / MyVCB中,我可以像这样访问它:
class MyVCA: MyInterface {
func someMethod() {
if self.shouldDoTask {
// do task
}
}
}
如果在前一个视图控制器中设置标志时内容仍然是nil,那么这将很好地工作。这是可以理解的,因为MyInterface当然还没有创建。我正在寻找一种方法。我一直在想一个可以在MyInterface的viewDidLoad方法中调用的方法来设置标志,但我似乎无法弄明白。
任何想法都会受到赞赏。
答案 0 :(得分:1)
像这样的东西。检查它是否有帮助。
protocol MyInterFaceDelegate {
func setValues()
}
MyInterFace {
let delegate : MyInterFaceDelegate
viewDidLoad() {
delegate.etValues()
}
}
extension MyContainer : MyInterFaceDelegate {
func setValues() {
content.shouldDoTast = self.shouldDoTast
}
}
之后创建MyInterFace()时,设置委托
content = MyInterFace()
content.delegate = self