如何在Swift中获取父ViewController的类名?

时间:2015-01-28 17:30:21

标签: swift uiviewcontroller

有没有办法在当前(孩子)UIViewController获取父VC的班级名称?我的孩子' VC(推送)有两个父母' UIViewController,所以我想知道哪一个是当前的父母?

7 个答案:

答案 0 :(得分:22)

这是一种方法:

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(如果有效)。

也就是说,这是代码味道 - 子视图控制器通常不知道他们的父视图控制器是谁。无论你正在解决什么问题,你都应该用告诉,不要问和代表来解决它。

答案 1 :(得分:5)

更新为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

答案 2 :(得分:2)

首先在视图控制器中添加扩展名

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

答案 3 :(得分:1)

只需使用view.parentViewController,最后使用title属性。

答案 4 :(得分:0)

已更新为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
    }
}

答案 5 :(得分:0)

尝试从children数组中选择一个孩子,如下所示:

if let parentVC = self.parent {

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

答案 6 :(得分:0)

添加此扩展并按其类型查找父视图。

extension UIResponder {
    
    func next<T: UIResponder>(_ type: T.Type) -> T? {
        return next as? T ?? next?.next(type)
    }
    
}

如何使用

self.next(UIViewController.self)