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

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

Ответ 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 {}}