簡體   English   中英

從Appdelegate獲取ViewController

[英]Get ViewController from Appdelegate

我的故事板中有四個視圖

  1. ViewOne
  2. ViewTwo
  3. ViewThree
  4. ViewFour

在我的ViewTwo ,我打電話並打開一個新的應用程序,當URL打開完成后,我在Appdelegate調用以下函數

func application(app: UIApplication, openURL url: NSURL, options: [String : AnyObject]) -> Bool

我在這里所做的是,我要遍歷所有viewControllers,因為我想找到ViewTwo以便能夠調用我創建的segue。 我想這樣做,因為我不想創建viewController的新實例。

通過下面的此功能可以很好地找到ViewTwo

if let viewControllers = window?.rootViewController?.childViewControllers {
    for viewController in viewControllers {
        if viewController.isKindOfClass(ViewTwo) {
            viewController.performSegueWithIdentifier("sw", sender: self)
        }
    }
}

但是現在我已經向ViewTwoViewThreeViewFour添加了NavigationController ,因此當我運行上面的代碼片段時,我只會得到viewController的以下結果(我做了一個簡單的print(viewController)

<ViewOne: 0x...>
<UINavigationController: 0x...>
<UINavigationController: 0x...>
<UINavigationController: 0x...>

所以我的問題是,既然我也有NavigationController,如何檢查ViewTwo?

我解決了

let storyboard = UIStoryboard(name: "Main", bundle: nil)
let controller = storyboard.instantiateViewControllerWithIdentifier("ViewThree") as! WebViewController
self.window?.rootViewController!.presentViewController(controller, animated: true, completion: { () -> Void in

})

您可以從情節提要中獲取視圖控制器,而無需創建新實例。 您不需要遍歷所有視圖控制器。 另外,為什么不將視圖控制器設置為導航控制器的根目錄而不是執行segue?

您可以從情節提要中獲取視圖控制器,如下所示:

let storyboard = UIStoryboard(name: "Main", bundle: nil)
let viewController = storyboard.instantiateViewControllerWithIdentifier("ViewTwo") as! ViewTwoViewController

因為現在您都可以使用UINavigationViewController 它僅僅是控制器的控制器。 您可以通過訪問viewControllers屬性的第一個元素,從UINavigationViewController訪問根視圖控制器。 然后,您可以進行插值。

根視圖控制器位於數組的索引0中,后視圖控制器位於索引n-2處,而頂部控制器位於索引n-1中,其中n是數組中的項數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM