从继承的类访问超类属性

时间:2018-06-01 12:29:40

标签: ios swift inheritance swift4

我有一个类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方法中调用的方法来设置标志,但我似乎无法弄明白。

任何想法都会受到赞赏。

1 个答案:

答案 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