Получить доступ к свойству суперкласса из унаследованного класса - PullRequest
0 голосов
/ 01 июня 2018

У меня есть класс 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 для установки флага, но я не могу понять это.

Любые идеи приветствуются.

1 Ответ

0 голосов
/ 01 июня 2018

Как то так.Проверьте, поможет ли это.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...