无法从展开的 segue 动作中弹出

Posted

技术标签:

【中文标题】无法从展开的 segue 动作中弹出【英文标题】:Can't pop from an unwind segue action 【发布时间】:2012-11-03 22:54:56 【问题描述】:

我有一个基于 tableview 的导航控制器。根视图控制器有一个 + 按钮,用于添加一个新项目。这会导致视图控制器的 push segue 允许用户输入新项目的数据。

在这个视图控制器上,左上角的导航栏项目是标准的标记为“返回”的按钮。我已将“保存”[bar] 按钮 [item] 作为右上角的导航栏项。

我创建了一个展开 IBAction 推送视图控制器。

然后,我从“保存”按钮拖动到视图控制器上的出口,并将其连接到展开 IBAction。

当我点击“保存”按钮时,会调用此展开操作。

但是,我在展开操作中所做的任何操作都不会弹出视图控制器。这是一个小代码:

- (BOOL)canPerformUnwindSegueAction:(SEL)action fromViewController:(UIViewController *)fromViewController withSender:(id)sender     

   return YES;


- (BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender 

   NSLog( @"Should seque from %@", identifier );
   return YES;


- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 



- (IBAction)unwindFromGoalEdit:(UIStoryboardSegue *)segue 

   NSLog( @"UNWINDING!!");

   [self.navigationController popToViewController:segue.destinationViewController animated:YES];

在下面的展开动作中,我尝试了各种方法来弹出视图控制器。但什么也没有发生。没有运行时错误,什么都没有。但是我确实看到了 NSLog(),所以我知道它正在被调用。

想法?

【问题讨论】:

【参考方案1】:

问题可能是您有一个保留周期。展开会自动弹出它上面的每个视图,除非它不能。你不会从放松中弹出任何东西。因此,将日志添加到您希望在 dealloc 方法或断点中弹出的视图控制器。如果这没有触发,那么您就知道视图控制器没有被弹出。这几乎可以肯定意味着您有一个保留周期。查看您的代表或您将自己(父母)传递到块中的任何地方。顶视图控制器不应该有对其父级的强引用。实际上,出于这个原因,任何孩子都不应该强烈提及其父母。如果这样做,则展开将不起作用。

【讨论】:

【参考方案2】:

unwindFromGoalEdit: 在哪个班级?看起来你可能已经将它添加到“新项目”视图控制器中......这个方法应该放在根视图控制器中,不需要调用popToViewController。一个空的方法在这里就足够了。

【讨论】:

以上是关于无法从展开的 segue 动作中弹出的主要内容,如果未能解决你的问题,请参考以下文章

使用后退按钮展开 segue 时执行代码

无法以编程方式执行 unwind segue

使用情节提要在 Xcode 6.1.1 中展开 Segue

从多个自定义 segue 展开到根控制器时崩溃

performSegueWithIdentifier 未从展开 segue 触发

自定义展开 Segue