如何在 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)
有什么方法可以得到 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)