必须有一个简单的解决方案,但在浏览StackExchange 4小时后,我放弃并试图在这里得到答案:
情况: iOS 5,Xcode 4.2.1,使用故事板
设定:
我致电:
[self performSegueWithIdentifier:@"programToSessions" sender:self];
prepareForSegue被调用,但之后没有任何内容。没有错误,没有警告。新的UITableViewController没有显示。
到目前为止,我的问题似乎有一个可能的解决方案。导航控制器。我想,如果我在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];
}
答案 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];
}
}