我使用三个视图控制器,在每个视图控制器上我放置UITableView
和UITableViewCell
。当我从情节提要中从第一个视图控制器的表视图单元格连接到另一个视图控制器并运行模拟器时,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。
首先,如果使用推送 segue,则如果第一个 segue 是模态的,则无法对第二个 segue 进行推送(除非您在导航控制器中嵌入第二个 VC)。
其次,确保每个 segue 的 de segue 标识符都是唯一的。
如果在情节提要中按 ctrl+拖动 segue,请不要在代码中调用performsegue
,只需尝试执行两次相同的操作。如果 segue 在情节提要中,则应在代码中使用prepareforsegue
委托。
完成所有这些操作的另一种方法是在故事板中不使用任何 segue,然后在代码 @didselectrowatindexpath
中您可以使用[storyboard instantiateviewcontrolerwithidentifier...]
实例化目标 vc,然后[self.navigationcontroller pushviewcontroller..]
推送 segue 或[self presentviewcontroller...]
模式。
编辑:此外,当您按 ctrl + 拖动时,请确保您是从单元格而不是从表格中拖动的。
自我回答
我终于发现问题不是在故事板中引起的 - 而是在实现代码上。由于我必须使用UITableViewCellStyleValue1
,我不能使用dequeueReusableCellWithIdentifier
,并且由于某些原因,必须使用dequeueReusableCellWithIdentifier
才能从情节提要中自动从单元格过渡到另一个视图控制器。我检查过,使用dequeueReusableCellWithIdentifier
并暂时禁用UITableViewCellStyleValue1
可以在不定义方法的情况下成功进行转换didSelectRowAtIndexPath:
。