iphone - 单击单元格时,Segue 触发但不推送/UITabBarController/UITableViewController

标签 iphone objective-c uitabbarcontroller uitableview storyboard

必须有一个简单的解决方案,但在浏览 StackExchange 4 小时后,我放弃并尝试在此处获得答案:

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

设置:

  • 根导航 Controller = UITabBarController 有 5 个项目
  • 每个选项卡都链接到一个 UITableViewController(通过 segues),它自动完美地工作
  • 我有每个 View Controller 和导航 Controller (UITabBarController) 的类
  • 我单击一个选项卡,说“程序”,它会显示一个项目列表(在链接的 UITableViewController 中),假设其中一个项目是“ session ”
  • 我点击“ session ”,didSelectRowAtIndexPath 被调用就好了。
  • 我现在想执行一个 segue(我已经从那个 UITableViewController,而不是单元连接到新的 UITableViewController,并给它一个标识符。
  • 我调用: [self performSegueWithIdentifier:@"programToSessions"sender:self];

  • prepareForSegue 被调用,但之后什么也没有。没有错误,没有警告。新的 UITableViewController 没有出现。

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

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

然而,什么都没有改变,它没有出现。

有什么想法吗?

已解决:

这里有一些问题。主要问题是我错过了在 UITabBarController 和 UITableViewController 之间放置“导航 Controller ”的事实。这可以通过向 Storyboard添加一个新的“导航 Controller ”来完成,然后从 UITabBarController(rootViewController)拖动到这个新 Controller 并设置一个关系。接下来,将一个 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];
    }

最佳答案

您必须使用 prepareForSegue:sender: 来触发 didSelectRowAtIndexPath: 的等效项。 (清空后者。)不是将新的 View Controller 推送到导航堆栈,而是 segue 已经有一个属性 destinationViewController 会自动工作。如果你想自定义新的 View Controller ,你可以修改这个属性。确保 segue.identifier 是正确的!

此外,根据您的问题,我注意到有关 View Controller 的 Controller 的一些混淆。您提到了其中两个:选项卡栏 Controller 和导航 Controller 。在 Storyboard中,设置应该是这样的:

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

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

关于iphone - 单击单元格时,Segue 触发但不推送/UITabBarController/UITableViewController,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8777462/

相关文章:

objective-c - 如何从 UIBezierPath 生成 CGPoint 数组(沿给定路径触摸滑动对象)

ios - 捕获 UITaBbarViewController 项目选择以决定显示它

ios - 具有滚动功能的自定义 UITabBarController

iphone - 使 ASIHTTP 请求超时

iphone - 如何检测状态栏中的触摸

iphone - 将跨度值转换为 map View 上的米

iphone - 模拟iphone锁屏

ios - 设计决策属性与变量

ios - 将 subview 添加到 View ,使其覆盖 UITabBar 但不覆盖 UINavigationBar

objective-c - 应用程序外部的 iOS 计时器