2012-01-12 16 views
10

我有一個通用應用程序,在這裏我共享一個iPad和iPhone故事板的相同控制器。 我已經把一個UILongPressGestureRecognizer上一個UITableView,即當按下iPhone蜂窩它調用執行賽格瑞一個動作:prepareForSegue不會在執行完畢後調用:withIdentifier:帶有彈出式樣

-(IBAction)showDetail:(id)sender { 
    UILongPressGestureRecognizer *gesture = (UILongPressGestureRecognizer*)sender; 
    if (gesture.state == UIGestureRecognizerStateBegan) { 
     CGPoint p = [gesture locationInView:self.theTableView]; 

     NSIndexPath *indexPath = [self.theTableView indexPathForRowAtPoint:p]; 
     if (indexPath != nil) { 
      [self performSegueWithIdentifier:SEGUE_DETAIL sender:indexPath]; 
     } 
    } 
} 

的SEGUE是作爲一個「推」進行的詳細視圖。你應該注意的第一件事是發件人是一個NSIndexPath,是我發現傳遞選定單元格的唯一方法。也許有更好的解決方案。 一切工作正常,從某種意義上說,執行segue,並且在prepareForSegue也被調用之前。

然而,它發生在iPad上,我已經改變了塞格標識符Popover。 現在事情正在發揮作用,segue被執行,但prepareForSegue沒有被調用,因此目標視圖控制器沒有按照它應該設置。

我在做什麼錯?

+0

我遇到同樣的問題。 viewdidload被調用,但不執行segue – 1dayitwillmake 2012-01-16 02:21:59

回答

20

我迄今發現的,是與任何賽格瑞標識符不酥料餅,這些都是通過iOS版所做的調用:

  • prepareForSegue(源控制器)
  • viewDidLoad中(目標控制器上)

而在酥料餅的原因請看調用順序是:

  • viewDidLoad中(目標控制器)
  • prepareForSegue(源控制器)

,只是因爲我把我所有的邏輯在viewDidLoad中,控制器是不正確初始化,以及事故發生。所以這不是真的,prepareForSegue沒有被調用,事實是我得到了一個異常,並且我錯誤地認爲prepareForSegue沒有被調用。

我不能把所有東西都放在viewWillAppear中,因爲必須調用CoreData,並且我不想檢查每次顯示視圖時實體是否正常。

我是如何解決這個問題的?我創建了目標控制器

-(void)prepareViewController { 
    // initialization logic... 
} 

另一種方法和改變prepareForSegue法源控制器本身:

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 
    MyViewController *mvc = (MyViewController*)[segue destinationViewController]; 
    // passing variable 
    // with segue style other than popover this called first than viewDidLoad 
    [email protected]"prop1"; 
    [email protected]"prop2"; 

    // viewWillAppear is not yet called 
    // so by sending message to controller 
    // the view is initialized 
    [mvc prepareViewController]; 

} 

不知道這是否有望與酥料餅的行爲,反正現在一切正常。

+0

您的修復工作對我來說也是如此謝謝,但這是一個奇怪的問題,因爲它只是爲我突然出現,即使我有其他幾個彈出菜單工作正常,並依靠prepareForSegue轉發對象。 – GeoffCoope 2012-06-13 21:29:56

+0

同樣在這裏,有時prepareForSegue之前調用viewDidLoad,有時後...感謝修復。 – 2012-06-26 07:59:17

+0

我覺得prepareForSegue在viewDidLoad之後被調用,當從Storyboard調用Segue時,如果使用-performSegueWithIdentifier:手動觸發它,則是另一種方式。 – gklka 2015-09-23 12:23:55

1

我注意到了在Xcode的主詳細模板(iPhone)鍋爐板代碼使用下面的模式來配置細節VC的看法:

  1. 細節VC的制定者(房產)中被覆蓋爲了調用configureView方法(configureView會更新視圖中的所有控件,例如標籤等。)
  2. 細節VC的viewDidLoad方法還調用configureView方法

我沒有按照這個模式,當我想在我的電影的應用程序重新使用細節VC的一天,這給了我麻煩。

我對popovers沒有太多經驗;然而,如果上面的模式與在popover內部顯示的細節VC一起使用,那麼當您在prepareForSegue方法中設置細節VC的屬性時,是否不配置細節VC的視圖?

相關問題