Как получить имя класса родительского ViewController в Swift?
есть ли способ получить имя класса родительского VC в present (child) UIViewController
? Мой "ребенок" VC (push) имеет два "родителя"UIViewController
s, поэтому я хотел бы знать, какой из них является текущим родителем?
4 ответов
вот один подход:
if let parentVC = self.parentViewController {
if let parentVC = parentVC as? someViewController {
// parentVC is someViewController
} else if let parentVC = parentVC as? anotherViewController {
// parentVC is anotherViewController
}
}
во-первых, назначить и дополнительно развернуть self.parentViewController
.
во-вторых, используйте дополнительный кастинг as?
, и назначьте контроллер вида parentVC
если это работает.
тем не менее, это запах кода - контроллеры дочернего представления обычно не должны знать, кто их родительские контроллеры представления. Какую бы проблему вы ни решили, вам, вероятно, следует решить ее с говори, не спрашивай и делегирование вместо этого.
ОБНОВЛЕНО ДО SWIFT 3
в вашем контроллере детского вида вы можете попробовать что-то вроде:
guard let parent = self.presentingViewController else{
// ...some code
return
}
//presented by parent view controller 1
if parent.isKind(of: Parent1.self){
// do something
}else{
//presented by parent view controller 2
}
я рекомендую вам разместить эту логику в вашем viewWillAppear
метод, потому что когда viewDidLoad
вызывается, нет никакой гарантии, что иерархия контроллера вида загружается в дерево навигации и, как следствие этого,presentingViewController
свойство вашего контроллера дочернего вида может быть nil
обновлено до Swift 4
Swift 4:
if let parentVC = self.parent {
if parentVC is someViewControllerr {
// parentVC is someViewController
} else if parentVC is anotherViewController {
// parentVC is anotherViewController
}
}
Swift 3:
if let parentVC = self.parentViewController {
if let parentVC = parentVC as? someViewController {
// parentVC is someViewController
} else if let parentVC = parentVC as? anotherViewController {
// parentVC is anotherViewController
}
}