Есть ли способ получить имя класса родительского VC в текущем (дочернем) UIViewController
? Мой "дочерний" VC (push) имеет два "родительских" UIViewController
s, поэтому я хотел бы узнать, какой из них является текущим родителем?
Как получить имя класса родительского ViewController в Swift?
Ответ 1
Здесь один подход:
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
, если он работает.
Тем не менее, это запах кода. Контроллеры дочерних представлений обычно не имеют представления о том, кто их родительский контроллер. Независимо от того, какую проблему вы решаете, вам, вероятно, следует решить проблему, сообщив, не спрашивайте и не делегируйте.
Ответ 2
ОБНОВЛЕНО до SWIFT 5
В вашем дочернем контроллере представления вы можете попробовать что-то вроде:
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
Ответ 3
Сначала добавьте расширение в контроллере представления
extension UIView {
var parentViewController: UIViewController? {
var parentResponder: UIResponder? = self
while parentResponder != nil {
parentResponder = parentResponder!.next
if let viewController = parentResponder as? UIViewController {
return viewController
}
}
return nil
}
}
Теперь используйте это как это
let vc = self.parentViewController
или же
if let parentVC = self.parentViewController {
if let parentVC = parentVC as? someViewController {
// parentVC is someViewController
} else if let parentVC = parentVC as? anotherViewController {
// parentVC is anotherViewController
}
}
Ответ 4
Просто используйте view.parentViewController
и со временем его свойство title
.
Ответ 5
Обновлено до Swift 4
Свифт 4:
if let parentVC = self.parent {
if parentVC is someViewControllerr {
// parentVC is someViewController
} else if parentVC is anotherViewController {
// parentVC is anotherViewController
}
}
Свифт 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
}
}
Ответ 6
попробуйте выбрать дочерний элемент из массива children следующим образом
if let parentVC = self.parent {
if let parentVC = parentVC.children[0] as? someViewController {}}