从表视图单元到另一个视图控制器的Segue转换只能在一些任意时间内工作 - 为什么?

时间:2014-02-25 10:22:27

标签: ios objective-c uitableview segue

我使用了三个视图控制器,并在每个视图控制器上放置了UITableViewUITableViewCell。当我从第一个视图控制器的表视图单元连接到故事板内的另一个视图控制器并运行模拟器时,segue按预期工作。但是,当我从第二个视图控制器的表视图单元连接到故事板中的最后一个视图控制器时,作为第一个完全相同的方式,那么由于某些原因,转换不起作用。

如果我定义didSelectRowAtIndexPath:并在其中调用第二个视图控制器的实现文件中的[self performSegueWithIdentifier:@"showDetail" sender:self];,则转换可以按预期工作。我不关心它是故事板segue还是我的代码中定义的方法来执行转换,只要转换确实正常工作。

但是,我仍然想知道为什么会出现这种不一致。正如我所说,我在两种情况下都以完全相同的方式连接了两个故事板,并检查了属性检查器和连接检查器,但我发现两者之间没有任何差异。

此外,虽然第一个视图控制器可以在没有定义方法的情况下执行转换,但是当我定义它时,转换不起作用,发出以下错误消息:

Finishing up a navigation transition in an unexpected state. Navigation Bar subview tree might get corrupted.

我想我不能同时使用这两种方法(即故事板segue和方法调用) - 我只是想知道是什么导致了这里的不一致。

我使用的是iOS 7和Xcode 5。

2 个答案:

答案 0 :(得分:1)

首先,如果你使用push segues,如果第一个segue是模态的,你不能推动第二个segue(除非你将第二个VC嵌入导航控制器中)。

其次,确保de segue标识符对于每个segue都是唯一的。

如果你在故事板中按住Ctrl +拖动一个segue,不要在代码中调用performsegue,你只需要尝试两次相同的操作。如果segue在故事板中,则在代码中应使用prepareforsegue委托。

完成所有这些操作的另一种方法是不在故事板中使用任何segue,然后在代码@ didselectrowatindexpath中,您可以使用[storyboard instantiateviewcontrolerwithidentifier...]实例化目标vc,然后使用[self.navigationcontroller pushviewcontroller..]来实现推送segue或[self presentviewcontroller...]为模态。

编辑:此外,当您按住Ctrl +拖动时,请确保从单元格而不是从表格中拖动。

答案 1 :(得分:0)

自我答案

我终于发现问题不是在故事板中引起的 - 它是关于实现代码的。由于我必须使用UITableViewCellStyleValue1,因此我无法使用dequeueReusableCellWithIdentifier,并且由于某些原因,必须使用dequeueReusableCellWithIdentifier才能从故事板内自动从单元格转换到另一个视图控制器只要。我检查了使用dequeueReusableCellWithIdentifier并暂时禁用UITableViewCellStyleValue1使其成功完成了未定义didSelectRowAtIndexPath:方法的转换。