Как получить имя класса родительского ViewController в Swift?

есть ли способ получить имя класса родительского VC в present (child) UIViewController? Мой "ребенок" VC (push) имеет два "родителя"UIViewControllers, поэтому я хотел бы знать, какой из них является текущим родителем?

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


просто использовать view.parentViewController и в конце концов его title собственность.


обновлено до 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
    }
}