当单击单元格时,查看触发但不推送/ UITabBarController / UITableViewController

时间:2012-01-08 12:24:28

标签: iphone objective-c uitabbarcontroller uitableview storyboard

必须有一个简单的解决方案,但在浏览StackExchange 4小时后,我放弃并试图在这里得到答案:

情况: iOS 5,Xcode 4.2.1,使用故事板

设定:

  • Root Navigation Controller =包含5个项目的UITabBarController
  • 每个标签链接到一个UITableViewController(通过segues),它可以完美地自动运行
  • 我有每个视图控制器和导航控制器(UITabBarController)
  • 的类
  • 我点击一个标签,说“程序”,它显示了一个项目列表(在链接的UITableViewController中),其中一项是“Sessions”
  • 我点击“Sessions”,didSelectRowAtIndexPath被调用就好了。
  • 我想现在执行一个segue(我已经从UITableViewController,而不是单元格连接到新的UITableViewController并给它一个标识符。
  • 我致电:     [self performSegueWithIdentifier:@"programToSessions" sender:self];

  • prepareForSegue被调用,但之后没有任何内容。没有错误,没有警告。新的UITableViewController没有显示。

  • 注意:但是,如果我将segue切换为“模态”,它会显示 - 但它会丢弃/隐藏底部的原始标签栏(不是......)

到目前为止,我的问题似乎有一个可能的解决方案。导航控制器。我想,如果我在AppDelegate中设置了一个导航控制器引用,一旦加载了实际的根导航控制器(在viewDidLoad中)就启动/设置它,即在viewDidLoad中基本上使用了以下行:app.navController = self.navigationController - 这可以工作!对?所以,我将segue操作更改为: [app.navController performSegueWithIdentifier:@"programToSessions" sender:self];

然而,没有任何改变,它没有出现。

有什么想法吗?

解决:

这里有一些问题。主要问题是我错过了在UITabBarController和UITableViewController之间放置一个“导航控制器”。这可以通过向故事板添加新的“导航控制器”,然后从UITabBarController(rootViewController)拖动到这个新控制器并设置RELATIONSHIP来完成。接下来,将RELATIONSHIP拖到UITableViewController。因此,如正确答案所示,它应该如下所示: UITabBarController - > (关系) - > UINavigationController - > (关系) - >的UITableViewController

为了在最后一个UITableViewController之上加载新的UITableViewControllers,一个简单的segue并通过代码调用它就足够了。最终的树将如下所示:

UITabBarController - > (关系) - > UINavigationController - > (关系) - > UITableViewController - > (segue) - >的UITableViewController

给segue一个标识符。在代码中,使用:

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

2 个答案:

答案 0 :(得分:3)

您必须使用prepareForSegue:sender:来触发相当于didSelectRowAtIndexPath:的内容。 (清空后者。)segue已经有一个属性destinationViewController,而不是在导航堆栈上推送新的视图控制器。如果要自定义新视图控制器,可以修改此属性。确保segue.identifier正确无误!

另外,从你的问题我发现有关视图控制器控制器的一些困惑。你提到其中两个:标签栏控制器和导航控制器。在故事板中,设置应该是这样的:

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

确保故事板中的所有这些都是正确的,看看它是否有效。

答案 1 :(得分:1)

您不必以编程方式performSegue。 你可以通过控制从第一个UITableViewController的UITableViewCell拖动到第二个UITableViewController,从第一个UITableViewController到故事板上的第二个创建一个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];
    }

}