Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 单击单元格时继续触发但不按下/UITabBarController/UITableViewController_Iphone_Objective C_Uitabbarcontroller_Uitableview_Storyboard - Fatal编程技术网

Iphone 单击单元格时继续触发但不按下/UITabBarController/UITableViewController

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

必须有一个简单的解决方案,但在浏览StackExchange 4小时后,我放弃了,并试图在这里得到答案:

情况: iOS 5,Xcode 4.2.1,使用故事板

设置:

  • 根导航控制器=带5项的UITabBarController
  • 每个选项卡都链接到UITableViewController(通过segues),它可以自动完美地工作
  • 我为每个视图控制器和导航控制器(UITabBarController)设置了类
  • 我单击一个选项卡,说“程序”,它会显示一个项目列表(在链接的UITableViewController中),说其中一个项目是“会话”
  • 我点击“Sessions”,didSelectRowAtIndexPath会被很好地调用
  • 我现在想执行一个segue(我已经从该UITableViewController(而不是单元格)连接到新的UITableViewController,并给它一个标识符)
  • 我呼吁:
    [self-PerformsgueWithIdentifier:@“programToSessions”发件人:self];

  • 调用prepareForSegue,但之后什么都没有。没有错误,没有警告。新的UITableViewController不会显示

  • 注意:但是,如果我将segue切换到“model”,它会显示出来,但它会丢弃/隐藏底部的原始选项卡栏(不是预期的…)
到目前为止,我的问题似乎有一个可能的解决方案。导航控制器。我想,如果我在AppDelegate中设置导航控制器引用,则在实际根导航控制器加载(在viewDidLoad中)后启动/设置它,也就是说,基本上在viewDidLoad中使用了如下内容:
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,还尝试链接自定义单元格