【问题标题】:Problems setting up a Navigation Controller using Story Board使用 Story Board 设置导航控制器的问题
【发布时间】:2012-04-16 07:20:06
【问题描述】:

我之前在 XCode 的早期版本中设置了导航控制器,但我正在使用最新版本并尝试使用故事板进行设置。我有标签栏控制器,它提供两种形式。第二个表单有一个 UITableview,当用户使用导航控制器进行选择时,我想将其移动到另一个表单。我已经在下面列出了我的关系。

问题似乎与我建立的关系有关。我已经控制从第二个窗体单击到导航控制器,弹出窗口为我提供了“推送、模式或自定义”的选择。我选择了“推送”,但是当我尝试运行下面的代码时,ir 不起作用。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
     NSUInteger row = [indexPath row];
     NSString *tSel = [listContents objectAtIndex:row];

     ConstantRateController *detailController = [[ConstantRateController alloc] initWithNibName:@"ConstantRateController_iPhone" bundle:nil];        
     [self.navigationController pushViewController:detailController animated:YES]
 }

我已经通过调试器运行了代码,它运行没有错误,但下一个表单没有显示。

【问题讨论】:

    标签: iphone xcode4 uinavigationcontroller storyboard


    【解决方案1】:

    从你的描述看来,有三个问题:

    1. Push segues 要求源视图控制器嵌入导航控制器 -- 相反,您让源视图控制器尝试将 导航控制器。

    2. 目标视图控制器也需要在情节提要中。

    3. 一旦你使用了故事板,你通常不想遵循从前故事板世界推送新视图控制器的模式(即,创建一个视图控制器并将其推送到tableView:didSelectRowAtIndexPath:) ...这样做会重复故事板为您完成的大量工作。

    改为:

    1. 将表格视图控制器放入导航控制器,将导航控制器放入选项卡视图控制器。 (您可以使用 Editor > Embed In 菜单执行此操作,或者将它们拖出库并拖动它们之间的“关系”连接。)

    2. 通过从库中拖出一个视图控制器并将其类设置为您的视图控制器类 (ConstantRateController),将您的目标视图控制器放入情节提要中(如果它不存在的话)。

    3. 将一个 push segue 从表视图单元格拖到目标视图控制器:

    完成所有三个步骤后,您的故事板应如下所示:

    最后,在表格视图控制器中,实现以下内容:

    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
    {
        // test segue.identifier if needed
        MyViewController *viewController = segue.destinationViewController;
        NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
        // set properties of viewController based on selection indexPath
    }
    

    segue 创建并推送视图控制器;您需要做的就是配置它,使其内容反映导致 segue 的表选择。 (注意,如果你有多个来自 table view controller 的 segue,你应该在 IB 中给每个 segues 一个唯一的标识符并在prepareForSegue:sender: 中测试它以配置适当的目标视图控制器。)


    如果您需要根据选取的单元格来支持表格视图之外的多个转场,那就有点不同了。显然,情节提要无法知道由您的委托/数据源填充的单元格,因此您无法设置单元格的转场......至少,不能在 动态 表中。

    听起来您可能类似于“设置”视图,其中有一组静态单元格,每个单元格都应与另一个视图(例如某些设置页面)相连接。在这种情况下,您可能希望查看从情节提要中获得的另一个功能:静态表。如果您在 IB 中选择表格视图(而不是表格视图控制器),属性检查器的顶部允许您在动态原型和静态单元格之间切换——前者是我上面描述的,后者允许您创建单元格和部分并完全在 IB 中编辑其内容。使用静态单元格,您可以从每个单元格中制作不同的转场......因此您可以几乎完全在 IB 中制作类似设置的多页 UI(当然,当切换开关等时,您仍然需要代码来执行某些操作)。

    如果您需要从 动态 表中支持多个 segue,则需要两件事:

    1. segues 的不同来源 - 一个单元格不能有多个 segues,但(表)视图控制器本身可以有多个 segues。

      李>
    2. 根据用户操作选择转场的逻辑。这里我们回到tableView:didSelectRowAtIndexPath:,但不是创建新的视图控制器并将其推送到导航控制器上或以模态方式呈现它,您只需在self 上调用performSegueWithIdentifier:

    this answer 提供了更多详细信息,Apple's view controllers guide 提供了有关故事板编程实践的更多信息:

    【讨论】:

    • 感谢您的回复,我已经按照说明添加了上面的代码,但是当我运行它时,prepareForSegue 永远不会被调用。我错过了什么?
    • 热门猜测:1) 你的prepareForSegue:sender: 方法在正确的类中吗?它应该在启动 segue 的视图控制器中(您的表视图控制器)。 2)表视图控制器实际上是那个类吗?检查 IB 中的身份检查器,确保它不是通用的 UITableViewController
    • 现在可以了,谢谢,这是因为我没有正确设置 Segue 标识符。如果我想切换到多个 Segue 会发生什么,比如从我的表格中每个选择都可以转到其他 10 种形式中的任何一种?
    • 谈论多个转场对于评论来说有点复杂,所以我编辑了我的答案。
    【解决方案2】:

    通常当你想使用导航控制器时,你必须嵌入它......

    Xcode 包含添加导航和标签栏的好方法 控制器——虽然它有点隐藏起来。首先,选择 查看控制器并转到编辑器菜单 -> 嵌入 -> 选项卡栏 控制器。 Xcode 将自动创建我们的新控制器并 链接现有的视图控制器。再次,选择视图 控制器,这次进入编辑器菜单 -> 嵌入 -> 导航控制器。你会看到 Xcode 插入了新的 标签栏控制器和视图之间的导航控制器 控制器。非常好——到目前为止,非常好!你的观点应该看起来像 这……

    [来自:http://maybelost.com/2011/10/tutorial-storyboard-in-xcode-4-2-with-navigation-controller-and-tabbar-controller-part1/]

    【讨论】:

      【解决方案3】:

      尝试取出“loadView”方法并将 viewDidLoad 保留在要显示的 ViewController 类上。

      【讨论】:

        【解决方案4】:

        如果您通过更改其 CUSTOM CLASS 从常规 ViewController 转换导航控制器,您会看到三个 segue(“推送、模态或自定义”)并且看不到“根视图控制器”。是的,它在 Storyboard 中称为“导航控制器”。但它的黄色图标不同。它在属性中缺少“导航控制器”部分,并且不能用作导航控制器。这可以通过更改 Storyboard 文件的 xml 源来解决。为什么他们称它为“嵌入”真的很令人困惑..

        【讨论】:

          猜你喜欢
          • 2014-03-09
          • 1970-01-01
          • 1970-01-01
          • 2012-06-11
          • 1970-01-01
          • 2015-05-22
          相关资源
          最近更新 更多