我有一个类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
}
}
}
如果不是因为在前一个视图控制器中设置了标志时内容仍然为零,这将很好地工作。这是可以理解的,因为MyInterface当然还没有创建。我在寻找一条超越这一切的道路。我一直在想一个可以在MyInterface的viewDidLoad方法中调用的方法来设置标志,但是我似乎无法理解。
任何想法都会很感激的。
最佳答案
像这样的东西。看看有没有帮助。
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
关于ios - 从继承的类访问父类(super class)属性,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50643476/