有没有办法在当前(孩子)UIViewController
获取父VC的班级名称?我的孩子' VC(推送)有两个父母' UIViewController
,所以我想知道哪一个是当前的父母?
答案 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)