我之前在XCode版本中设置了一个导航控制器,但我使用的是最新版本,并尝试使用故事板进行设置。我有Tab Bar Controller,它提供两种形式。第二种形式有一个UITableview,当用户使用导航控制器进行选择时,我想移动到另一种形式。我已经阐述了我的关系如何在下面看。
问题似乎与我的关系建立有关。我控制点击从第二个表单到导航控制器,弹出窗口为我提供了“推送,模态或自定义”选项。我选择了“推送”,但是当我尝试运行下面的代码时,红外线无效。
- (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]
}
我通过调试器运行代码,它运行时没有错误,但下一个表单没有显示。
答案 0 :(得分:9)
根据您的描述,听起来有三个问题:
推送segues要求源视图控制器嵌入导航控制器 - 而是让源视图控制器尝试将划分为导航控制器。
目标视图控制器也需要位于故事板中。
一旦您使用故事板,您通常不希望遵循从故事前世界推送新视图控制器的模式(即创建视图控制器并在{{1}中推送它})......这样做会复制一些故事板为你做的工作。
相反:
将表格视图控制器放入导航控制器,并在标签视图控制器中放置导航控制器。 (您可以使用编辑器>嵌入菜单,或将它们拖出库并拖动它们之间的“关系”连接来执行此操作。)
通过从库中拖出视图控制器并将其类设置为视图控制器类(tableView:didSelectRowAtIndexPath:
),将目标视图控制器放在故事板中(如果它不存在)。
将push segue从表格视图单元格拖到目标视图控制器:
完成所有三个步骤后,您的故事板应如下所示:
最后,在表视图控制器中,实现以下内容:
ConstantRateController
segue创建并推送视图控制器;您需要做的就是配置它以使其内容反映导致segue的表选择。 (请注意,如果表视图控制器中有多个segue,则应在IB中为每个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,则会有所不同。显然,故事板无法知道由委托/ dataSource填充的单元格,因此您无法从单元格设置segues ...至少不能在动态表中设置。< / p>
听起来你可能就像一个设置视图,你有一个静态的单元格集,其中每个单元格应该转到另一个视图(如某些设置页面)。在这种情况下,您可能希望查看从故事板中获得的另一个功能:静态表。如果在IB中选择表视图(而不是表视图控制器),属性检查器的顶部允许您在动态原型和静态单元之间切换 - 前者是我上面描述的,后者允许您创建单元格并完全在IB中划分和编辑其内容。使用静态单元格,您可以从每个单元格中创建一个不同的区域...因此您可以完全在IB中创建一个类似于多页设置的UI(当然,当切换交换机时,您仍然需要代码来执行某些操作)。
如果您需要从动态表中支持多个segue,则需要两件事:
segue的不同来源 - 您不能从单元格中出现多个segue,但是您可以从(table)视图控制器本身出现多个segue。
根据用户的操作选择segue的逻辑。在这里,我们回到prepareForSegue:sender:
,但不是创建新的视图控制器并将其推送到导航控制器上或以模态方式呈现它,而只需在tableView:didSelectRowAtIndexPath:
上调用performSegueWithIdentifier:
。
this answer中有关于此类内容的详细信息,以及Apple's view controllers guide中有关故事板编程实践的更多详情:
答案 1 :(得分:2)
通常,当您想要使用导航控制器时,您必须嵌入它......
Xcode包含一种添加导航和标签栏的好方法 控制器 - 虽然它有点隐藏。首先,选择 查看控制器并转到编辑器菜单 - &gt;嵌入 - &gt;的TabBar 控制器。 Xcode将自动创建我们的新控制器和 链接现有的视图控制器。再次,选择视图 控制器和这次进入编辑菜单 - &gt;嵌入 - &gt; 导航控制器。你会看到Xcode插入新的 标签栏控制器和视图之间的导航控制器 控制器。非常好 - 到目前为止,非常好!你的意见应该是这样的 此...
答案 2 :(得分:0)
尝试取出“loadView”方法,并将viewDidLoad保留在要显示的ViewController类上。
答案 3 :(得分:0)
你看到三个segues('Push,Modal或Custom')并且如果你通过改变它的CUSTOM CLASS从常规ViewController中获得导航控制器CONVERTED,则看不到'根视图控制器'。是的,它在Storyboad中称为“导航控制器”。但它的黄色图标是不同的。它缺少属性中的“导航控制器”部分,它不能用作导航控制器。这可以通过更改Storyboard文件的xml源来修复。它真的令人困惑,为什么他们称之为“嵌入”..