如何在 Swift 中获取 class parent ViewController 的名称?

How to get class name of parent ViewController in Swift?

有什么方法可以得到 class parent VC 的名字在现在 (child) UIViewController?我的 'child' VC (push) 有两个 'parent'UIViewController,所以我想知道哪个是当前 parent?

只需使用 view.parentViewController 并最终使用其 title 属性。

这是一种方法:

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

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

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

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

尝试从 children 数组中选择 child,如下所示

if let parentVC = self.parent {

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

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

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

如何使用

self.next(UIViewController.self)