2016-05-16 119 views
-5

所以,我有導航控制器。有從根視圖控制器繼續其他視圖控制器。訪問導航堆棧中的當前視圖控制器

當我想訪問其他視圖控制器時,我將覆蓋prepareForSegue方法並使用destinationViewController屬性。

但這對我來說並不好。我所有在prepareForSegue中的東西都會在每次調用segue時執行,但我不想要它。其次,它破壞了我的代碼的邏輯:在performSegueWithIdentifier(實際上之前)執行跳轉到代碼中的其他地方。

如果我可以像訪問Root ViewController一樣訪問其他視圖控制器,例如通過關鍵字self,那將會很棒。

這是代碼示例,使我的問題更加清晰的:

func startWorking() { 
    /*here we made some stuff for current VC 
... 
... 
*/ 

    //next we go to new View Controller 
    performSegueWithIdentifier("newVC", sender: nil) 

    //then all actions that I want to do begin at another method - prepareForSegue 
    //But I want get access to View Controller that user sees now! 
    //For example present some view: 

    let someView = UIView(frame: someFrame) 
    /*question subject*/.view.addSubview(somView) 
    } 

/問題受到/- 是我的賽格瑞和我的問題點提出的當前視圖控制器。

+1

*「在prepareForSegue我的東西都將執行每當SEGUE被稱爲,但我不想要它「* - 那麼不要把它放在那裏......我很難理解你的問題究竟是什麼,可以展示一些代碼來證明你的問題是什麼? – luk2302

+1

導航控制器有三種方法可以訪問導航堆棧上的項目。你有沒有試過其中的任何一個來看看它們是否適合你? – Desdenova

+0

是的!這是我的觀點!我提出了Segue的新控制器,這是否意味着我必須在prepareForSegue方法中完成所有我想用新控制器做的事情? –

回答

3

謝爾蓋Gamayunov,

可以使用總是訪問在導航堆棧的頂部mostViewController,

let viewCOntroller = self.navigationController?.topViewController 

編輯

我相信,如果你不能讓周圍的prepareForSegue或自你的邏輯.navigationController?.topViewController你必須看看你的設計模式:)

話雖這麼說,我理解你想要做的是訪問performSegue後視圖控制器不使用prepareForSegue,您可以使用此代碼

func navigationController(navigationController: UINavigationController, didShowViewController viewController: UIViewController, animated: Bool) { 
     if viewController is YourDestinationViewControllerClass { 
      print("You have access to viewController loaded do whatever you want") 
     } 
} 

上述功能是導航控制器委託:)所以,你將不得不聲明你的viewController來確認UINavigationControllerDelegate。像

class ViewController: UIViewController,UINavigationControllerDelegate 

override func viewDidLoad() { 
     super.viewDidLoad() 
     self.navigationController?.delegate = self 
} 

完蛋了,你是好去:)快樂編碼好友:)

+0

我試圖用'topViewController'屬性: 'performSegueWithIdentifier( 「NewVCSegue」,發件人:個體經營)? 讓NEWVC = self.navigationController .topViewController' 但是'newVC'其實是VC我從哪裏來? –

+0

@ sergey-gamayunov:我相信你非常困惑:)讓我們幫助你:)準備segue是用來準備destinationViewController甚至在其呈現或加載到導航堆棧之前:)所以,如果你想配置viewCOntroller甚至在渲染之前,您應該使用segue.destinationViewController來爲Segue做準備:)另一方面,假設您的視圖控制器已經加載,並且是導航堆棧中的topViewController,您可以使用self.navigationController?.topViewController。這種方法會讓你訪問現有的實例 –

+0

謝謝你的回答! 但在此代碼示例中,我沒有使用'prepareForSegue',我使用'performSegueWithIdentifier'應該在導航堆棧頂部加載destinationVC ... –

相關問題