【问题标题】:Segue firing but not pushing / UITabBarController / UITableViewController when cell clicked单击单元格时继续触发但不推送 / UITabBarController / UITableViewController
【发布时间】:2012-02-05 08:11:04
【问题描述】:

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

情况: iOS 5,Xcode 4.2.1,使用 Storyboards

设置:

  • 根导航控制器 = 带有 5 个项目的 UITabBarController
  • 每个选项卡都链接到一个 UITableViewController(通过 segues),它可以完美地自动运行
  • 我有每个视图控制器和导航控制器 (UITabBarController) 的类
  • 我点击一个选项卡,说“程序”,它会显示一个项目列表(在链接的 UITableViewController 中),说这些项目之一是“会话”
  • 我点击“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 拖到 UITableViewController。因此,正如正确答案所述,它应该如下所示: UITabBarController --> (关系) --> UINavigationController --> (关系) --> UITableViewController

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

UITabBarController --> (relationship) --> UINavigationController --> (relationship) --> UITableViewController --> (segue) --> UITableViewController

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

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

【问题讨论】:

  • 您的解决方案对我有用。您应该将其发布为答案,以便人们可以投票

标签: iphone objective-c uitabbarcontroller uitableview storyboard


【解决方案1】:

您必须使用prepareForSegue:sender: 来触发didSelectRowAtIndexPath: 的等效项。 (清空后者。)segue 没有将新的视图控制器推送到导航堆栈上,而是已经有一个属性destinationViewController,它将自动工作。如果要自定义新的视图控制器,可以修改此属性。确保segue.identifier 正确!

另外,从您的问题中,我注意到视图控制器的控制器有些混淆。您提到了其中两个:标签栏控制器和导航控制器。在故事板中,设置应该是这样的:

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

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

【讨论】:

  • 嘿 Mundi,感谢您的快速回答。我试着听从你的建议,但不会再进一步​​了。我删除了didSelectRowAtIndexPath - 并将一个segue 从UITableViewController 拖到下一个UITableViewController。我还向prepareForSegue 添加了一些调试代码,但如果我不以编程方式调用它,它就不会被调用。因此,我尝试将 segue 从 UITableViewController Cell 拖到最终的 UITableViewController(永远不会出现的那个)并再次运行它。也不行。卡住了……
  • 这就是故事板的样子(注意三个连接的屏幕,这些才是最重要的)imgur.com/fEGNF - “控制器导航”可以很好地加载每个 UITableViewControllers - 我有代码在“控制器程序”中显示 1 行。如果我点击它,我想执行另一个 segue 并显示“控制器会话”。我现在已经删除了代码,只在“控制器程序”中有这个:- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { NSLog(@"controllerProgram:: prepareForSegue: %@", segue.identifier );,它不会触发
  • 根据图片你没有按照我的回答进行设置。最左边的控制器是标签栏控制器,下一个必须是导航控制器(您缺少),然后是“程序”控制器。
  • 不起作用。让我们看看:所以这应该代表您的建议,对吗? imgur.com/I9ILc - 试过了,点击“程序”加载 UITableViewController,点击里面的一个项目,并没有做最后的 segue。尝试了两种变体:将 segue 从 UITableViewController 链接到新的 UITableViewController,还尝试将自定义单元格链接到新的 UITableViewController。现在将在此处尝试通过代码,将在一分钟内报告。
  • 让它工作。将在上面发布答案。再次感谢,你拯救了我的下午。
【解决方案2】:

您不必以编程方式performSegue。 您可以通过将控件从第一个 UITableViewController 的 UITableViewCell 拖动到第二个 UITableViewController 来创建从第一个 UITableViewController 到情节提要上的第二个的转场。如果不执行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];
    }

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-10
    • 2017-10-04
    • 1970-01-01
    • 2021-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多