取回parentViewController

时间:2017-01-24 09:08:48

标签: swift uiviewcontroller swift2

我有PhoneViewController : UIViewController

let phonePage = storyboard.instantiateViewControllerWithIdentifier("phoneViewController") as! PhoneViewController

我将从两个不同的控制器中展示它。

// UIViewController1
self.navigationController?.pushViewController(phonePage, animated: true)

// UIViewController2
self.presentViewController(phonePage.embedInNavController(), animated: true, completion: nil)

我想要检测哪个控制器是其父控制器。我怎么能这样做?

4 个答案:

答案 0 :(得分:0)

简短的回答是:

if let navController = self.navigationController {
    return navController.viewControllers[navController.viewControllers.count - 1]
    // take care if count <= 1
else {
    return self.parent
}

但这是你真正想要的吗?你试图根据谁是他的父母来实施什么行为? 我不能解答这个问题,但你应该让你的代码可读。让我通过一个例子来解释:

let phonePage = storyboard.instantiateViewControllerWithIdentifier("phoneViewController") as! PhoneViewController

// Option 1
self.navigationController?.pushViewController(phonePage, animated: true)
phonePage.mode = PhonePageMode.list


// Option 2
self.presentViewController(phonePage.embedInNavController(), animated: true, completion: nil)
phonePage.mode = PhonePageMode.grid

// In your PhoneViewController class
switch self.mode {
    case .list: // present as a list
    case .grid: // present as a grid
}

比以下内容更具可读性:

let phonePage = storyboard.instantiateViewControllerWithIdentifier("phoneViewController") as! PhoneViewController

// Option 1
self.navigationController?.pushViewController(phonePage, animated: true)

// Option 2
self.presentViewController(phonePage.embedInNavController(), animated: true, completion: nil)

// In your PhoneViewController class
guard let parent = self.parentViewController else { return }
if parent is ThisClassWhichWantsAList {
    // present as list
} else if parent is ThisOtherClassWhichWantsAGrid {
    // present as grid
}

如果您想使用其父级作为条件以不同方式执行操作,则您更倾向于使用其他属性。你的未来将会感激不尽。

答案 1 :(得分:0)

您可以尝试以下代码: -

if let wd = self.window {
       var vc = wd.rootViewController
       if(vc is UINavigationController){
            vc = (vc as UINavigationController).visibleViewController
        }

        if(vc is YourViewController){
            //your code
        }
    }

答案 2 :(得分:0)

如果您的导航视图控制器是从navigationViewController推送而不是父视图中的父类可用,并且如果显示的话比在可用的presentationController中。

您可以这样检查:

if let parentVC = self.navigationController.parentViewController{
   //parentVC.className

}

if let presentedVC = self.navigationController?.presentationController{
   //presentedVC.className      
}

答案 3 :(得分:-1)

因此,您基本上必须检查导航控制器堆栈中的视图控制器,索引count - 1是否是您要查找的视图控制器类型。

简短版本:

if navigationController.viewControllers[navigationController.viewControllers.count - 1].isKind(of: TheVCYouAreLooking for.self) {
    print("it is")
} else {
    print("it is NOT")
}

游乐场的长版:

//These are your two view controllers
class FirstVCClass: UIViewController {}
class SecondVCClass: UIViewController {}


let vc = FirstVCClass()
let secondVC = SecondVCClass()
//Create a navigationcontroller and add the first VC in the stack
let navigationController = UINavigationController()
navigationController.setViewControllers([vc], animated: true)

//Now push the secondVC
vc.navigationController?.pushViewController(secondVC, animated: true)

//The last vc in the stack is the one you've just pushed
print(navigationController.viewControllers.last!)

// Now check
if navigationController.viewControllers[navigationController.viewControllers.count - 1].isKind(of: FirstVCClass.self) {
    //The view controller that is before you current vc in the stack is of the class 
    print("it is")
} else {
    print("it is NOT")
}