web-dev-qa-db-fra.com

Comment obtenir le nom de classe du ViewController parent dans Swift?

Existe-t-il un moyen d'obtenir le nom de classe du parent VC dans le présent (enfant) UIViewController? Mon 'enfant' VC (Push) a deux 'parent' UIViewControllers, donc je voudrais savoir lequel est le parent actuel?

17
Marko

Voici une approche:

if let parentVC = self.parentViewController {
    if let parentVC = parentVC as? someViewController {
        // parentVC is someViewController
    } else if let parentVC = parentVC as? anotherViewController {
        // parentVC is anotherViewController
    }
}

Tout d'abord, attribuez et éventuellement déballer self.parentViewController.

Deuxièmement, utilisez la conversion facultative as?, et affectez le contrôleur de vue à parentVC si cela fonctionne.

Cela dit, il s'agit d'une odeur de code - les contrôleurs de vue enfants ne devraient généralement pas savoir qui sont leurs contrôleurs de vue parents. Quel que soit le problème que vous résolvez, vous devriez probablement le résoudre avec dites, ne demandez pas et la délégation à la place.

23
Aaron Brager

MIS À JOUR À Swift 5

Dans votre contrôleur de vue enfant, vous pouvez essayer quelque chose comme:

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
}

Je vous recommande de placer cette logique dans votre méthode viewWillAppear car lorsque viewDidLoad est appelé, il n'y a aucune garantie que la hiérarchie du contrôleur de vue est chargée dans l'arborescence de navigation et comme conséquence de cela, le presentingViewController la propriété de votre contrôleur de vue enfant peut être nil

6
mauricioconde

Ajoutez d'abord l'extension dans le contrôleur de vue

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
    }
}

Maintenant, utilisez-le comme ça

let vc = self.parentViewController

ou

if let parentVC = self.parentViewController {
    if let parentVC = parentVC as? someViewController {
        // parentVC is someViewController
    } else if let parentVC = parentVC as? anotherViewController {
        // parentVC is anotherViewController
    }
}
2
Kavin Soni

Utilisez simplement view.parentViewController et éventuellement sa propriété title.

1
qwerty_so

essayez de choisir l'enfant dans le tableau des enfants comme suit

if let parentVC = self.parent {

            if let parentVC = parentVC.children[0] as? someViewController {}}
0
Yosra Nagati

Mis à jour à 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
    }
}
0
Marvin Ruciński