4

必須有一個簡單的解決這個,但4小時瀏覽StackExchange後,我放棄了,並試圖讓這個回答在這裏:Segue公司解僱,但不推/的UITabBarController /時的UITableViewController單擊單元格

情況: iOS 5中,Xcode的4.2.1,使用故事板

設置:

  • 根導航控制器=的UITabBarController用5項
  • 每個標籤鏈接到U形我有類爲每個視圖控制器和導航控制器(UITabBarController)
  • 我點擊一個選項卡,說「程序」,它顯示我的項目列表(在鏈接的UITableViewController),說這些項目之一是「會話」
  • 我點擊「會話」,didSelectRowAtIndexPath被調用就好。
  • 我想現在(我已經遠離了的UITableViewController,而不是細胞,新的UITableViewController連接,並賦予它一個標識符進行賽格瑞
  • 我打電話。 [self performSegueWithIdentifier:@"programToSessions" sender:self];

  • prepareForSegue被稱爲,但沒有任何事後。沒有錯誤,沒有警告。新的UITableViewController沒有顯示。

  • 注意:但是,如果我切換到「模式」原來的標籤欄在底部然後(不打算...)

到目前爲止,我的問題似乎有一個可能的解決方案。導航控制器。我想,如果我在AppDelegate中設置了一個導航控制器引用,一旦加載了實際的根控制器(在viewDidLoad中),即在viewDidLoad中基本上使用了一些東西:app.navController = self.navigationController - 就可以工作!對?所以,我將賽格動作改爲: [app.navController performSegueWithIdentifier:@"programToSessions" sender:self];

然而,沒有任何變化,它沒有顯示出來。

任何想法?

解決:

有在這裏的幾個問題。主要問題是我錯過了在UITabBarController和UITableViewController之間放置一個「導航控制器」。這可以通過向故事板中添加一個新的「導航控制器」來完成,然後從UITabBarController(rootViewController)拖到這個新的控制器並設置RELATIONSHIP。接下來,將一個RELATIONSHIP拖動到UITableViewController。因此,通過正確的答案概括它應該看起來像: 的UITabBarController - >(關係) - >的UINavigationController - >(關係) - >的UITableViewController

爲了在最後的頂部加載新UITableViewControllers UITableViewController,一個簡單的segue並通過代碼調用它就足夠了。最後的樹看起來像:

的UITabBarController - >(關係) - >的UINavigationController - >(關係) - >的UITableViewController - >(SEGUE) - >的UITableViewController

給了一個賽格瑞標識符。在代碼中,使用此:

 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
    { 
     [self performSegueWithIdentifier:@"loadMyDetailView" sender:self]; 
    } 
+0

您的解決方案爲我工作。你應該將它作爲答案發布,以便人們可以投票。 – 2012-01-23 21:28:13

回答

3

你必須使用prepareForSegue:sender:火的didSelectRowAtIndexPath:相當。 (清空後者。)而不是推動導航堆棧上的新視圖控制器,segue已經有一個屬性destinationViewController,將自動工作。如果你想定製新的視圖控制器,你可以修改這個屬性。確保segue.identifier是正確的!

此外,從您的問題我注意到一些關於視圖控制器的控制器的混淆。您提到其中兩個:標籤欄控制器和導航控制器。在故事板中,設置應該是這樣的:

TabBarController --(relationship)--> NavigationController 
--(relationship)--> ViewController 
--(segue)--> next ViewController 

確保所有這些在故事板中都是正確的,並查看它是否有效。

+0

嘿蒙迪,感謝您的快速答覆。我試着按照你的建議,但不會再有進一步的了。我刪除了'didSelectRowAtIndexPath' - 並將一個從UITableViewController的segue拖到下一個UITableViewController。我還在'prepareForSegue'中添加了一些調試代碼,但是如果我不以編程方式調用它,則不會調用它。所以我嘗試並將UIVableViewController Cell中的segue拖到最後的UITableViewController(從未出現過的那個)並再次運行它。也不行。卡住...... – 2012-01-08 13:10:27

+0

這就是故事板的樣子(注意三個連接的屏幕,這些都是重要的)http://imgur.com/fEGNF - 「控制器導航」加載每個UITableViewController都很好 - 我有「控制器程序」中的代碼顯示1行。如果我點擊它,我想執行另一個搜索並顯示「控制器會話」。我已經刪除了代碼,只有在「控制器程序」中有這個:' - (void)prepareForSegue :(UIStoryboardSegue *)segue sender:(id)sender NSLog(@「controllerProgram :: prepareForSegue:%@」, segue.identifier);'並且它不會觸發 – 2012-01-08 13:11:34

+0

根據圖片**,您在我的回答中沒有按照**所述進行設置。最左邊的控制器是標籤欄控制器,下一個控制器必須是導航控制器(您缺少),然後是「程序」控制器。 – Mundi 2012-01-08 13:14:31

1

您不必以編程方式使用performSegue。 您可以通過控件從第一個UITableViewController的UITableViewCell拖動到第二個UITableViewController,從第一個UITableViewController創建一個segue到故事板上的第二個segue。如果不執行SEGUE,其最可能的原因是,在方法

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 

,並在小區標識的「屬性檢查器」不匹配。

要從第一的UITableViewController數據傳遞給第二個添加下面的方法來第一:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if ([[segue identifier] isEqualToString:@"loadMyDetailView"]) { 
     MyDetailViewController *detailVC = [segue destinationViewController]; 
     NSIndexPath *selectedRowIndex = [self.tableView indexPathForSelectedRow]; 
     detailVC.dataToPass = [self getDataToPass:selectedRowIndex.row]; 
    } 

} 
相關問題