我有一个类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/

10-08 22:38