Iphone 单击单元格时继续触发但不按下/UITabBarController/UITableViewController
必须有一个简单的解决方案,但在浏览StackExchange 4小时后,我放弃了,并试图在这里得到答案: 情况: iOS 5,Xcode 4.2.1,使用故事板 设置:Iphone 单击单元格时继续触发但不按下/UITabBarController/UITableViewController,iphone,objective-c,uitabbarcontroller,uitableview,storyboard,Iphone,Objective C,Uitabbarcontroller,Uitableview,Storyboard,必须有一个简单的解决方案,但在浏览StackExchange 4小时后,我放弃了,并试图在这里得到答案: 情况: iOS 5,Xcode 4.2.1,使用故事板 设置: 根导航控制器=带5项的UITabBarController 每个选项卡都链接到UITableViewController(通过segues),它可以自动完美地工作 我为每个视图控制器和导航控制器(UITabBarController)设置了类 我单击一个选项卡,说“程序”,它会显示一个项目列表(在链接的UITableViewC
- 根导航控制器=带5项的UITabBarController
- 每个选项卡都链接到UITableViewController(通过segues),它可以自动完美地工作
- 我为每个视图控制器和导航控制器(UITabBarController)设置了类
- 我单击一个选项卡,说“程序”,它会显示一个项目列表(在链接的UITableViewController中),说其中一个项目是“会话”
- 我点击“Sessions”,didSelectRowAtIndexPath会被很好地调用
- 我现在想执行一个segue(我已经从该UITableViewController(而不是单元格)连接到新的UITableViewController,并给它一个标识符)
- 我呼吁:
[self-PerformsgueWithIdentifier:@“programToSessions”发件人:self];
- 调用prepareForSegue,但之后什么都没有。没有错误,没有警告。新的UITableViewController不会显示
- 注意:但是,如果我将segue切换到“model”,它会显示出来,但它会丢弃/隐藏底部的原始选项卡栏(不是预期的…)
app.navController=self.navigationController
,这可以工作!对吗?因此,我将segue操作更改为:
[app.navController performsguewithidentifier:@“programToSessions”发送者:self];
然而,没有任何变化,它不会出现
有什么想法吗
已解决:
这里有一些问题。主要问题是我没有在UITabBarController和UITableViewController之间放置“导航控制器”。这可以通过向情节提要添加新的“导航控制器”,然后从UITabBarController(rootViewController)拖动来完成指向此新控制器并设置关系。接下来,将关系拖动到UITableViewController。因此,如正确答案所述,它应该如下所示:
UITableViewController-->(关系)-->UINavigationController-->(关系)-->UITableViewController
为了在最后一个UITableViewController上加载新的UITableViewController,只需一个简单的segue并通过代码调用它即可。最终的树如下所示:
UITableViewController-->(关系)-->UINavigationController-->(关系)-->UITableViewController-->(segue)-->UITableViewController
给序列一个标识符。在代码中,使用:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
[self performSegueWithIdentifier:@"loadMyDetailView" sender:self];
}
您必须使用
prepareforsgue:sender:
来触发相当于didSelectRowAtIndexPath:
(清空后者)segue没有在导航堆栈上推送新的视图控制器,而是已经有一个属性destinationViewController
,该属性将自动工作。如果要自定义新的视图控制器,可以修改此属性。请确保segue.identifier
正确
另外,从您的问题中,我注意到一些关于视图控制器的控制器的混淆。您提到了其中两个:选项卡栏控制器和导航控制器。在故事板中,设置应如下所示:
TabBarController --(relationship)--> NavigationController
--(relationship)--> ViewController
--(segue)--> next ViewController
确保故事板中的所有这些都是正确的,然后看看它是否有效。您不必通过编程方式执行脚本。 通过将控件从第一个UITableViewController的UITableViewCell拖动到第二个UITableViewController,可以创建从故事板上的第一个UITableViewController到第二个UITableViewController的序列。如果未执行序列,最可能的原因是,方法中的单元标识符
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
与“属性检查器”中的不匹配
要将数据从第一个UITableViewController传递到第二个UITableViewController,请将以下方法添加到第一个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];
}
}
嘿,Mundi,谢谢你的快速回答。我试着听从你的建议,但没有进一步的建议。我删除了
didSelectRowAtIndexPath
-并将一段从UITableViewController拖到下一个UITableViewController。我还向prepareforsgue
添加了一些调试代码,但如果我不调用它,它就不会被调用以编程方式调用它。因此,我尝试将segue从UITableViewController单元格拖到最终的UITableViewController(从未出现的一个)并再次运行它。也不起作用。卡住了…这就是故事板的样子(注意,三个相连的屏幕,它们才是重要的)-“控制器导航”加载每个UITableViewControllers很好-我在“控制器程序”中有代码显示1行。如果我点击它,我想执行另一个序列并显示“控制器会话”。我现在已经删除了代码,只在“控制器程序”中有此代码:-(void)prepareForSegue:(UIStoryboardSegue*)segue sender:(id)sender{NSLog(@“controllerProgram::prepareForSegue:%@”,segue.identifier);
并且它不会启动根据图片,您没有按照我的回答中所述进行设置。最左边的控制器是选项卡栏控制器,下一个必须是导航控制器(您缺少),然后是“程序”控制器。不起作用。让我们看看:这应该代表您的建议,对吗?-尝试过,单击“程序”加载UITableViewController,单击其中的一项,但不执行最后一个步骤。尝试了两种变体:将UITableViewController的分段链接到新的UITableViewController,还尝试链接自定义单元格