目标 C:后退按钮 segue 不起作用

Posted

技术标签:

【中文标题】目标 C:后退按钮 segue 不起作用【英文标题】:Objective C: Back button segue not working 【发布时间】:2014-06-19 03:01:46 【问题描述】:

我有一个带有 2 个屏幕的简单应用。 当我按下一个按钮从第一个到第二个时,一切都成功执行(包括动画)。但是,当我单击第二个屏幕上的后退按钮时,会收到以下警告:

Warning: Attempt to present <getTextViewController: 0x8f6aa30> on <SecondViewController: 0x946cc80> whose view is not in the window hierarchy!

编辑:请不要向我提出有关上述警告的其他问题 - 我已经看到了这些问题,它们提到了其他问题。

但是,它仍会切换回第一个屏幕。然而,segue 的动画并没有执行。 另外:当我返回第一个屏幕时,第一个屏幕中的信息(例如输入的文本)会保留,而每次屏幕出现时第二个屏幕中的信息都会重置。

我是这样称呼这两种操作的:

Segue from View 1 to View 2:
Name: F21, Style: Modal, Transition: Cross Dissolve, Animation: True.

Segue from View 2 to View 1:
Name: F12, Style: Modal, Transition: Cross Dissolve, Animation: True.

getTextViewController.m 中的代码(视图 1):

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
if([[segue identifier] isEqualToString:@"F21"])
    UIViewController *v = [segue destinationViewController];
   [self dismissViewControllerAnimated:NO completion:nil];
    v = self;



-(void)performSegue:(NSString*)str
[self performSegueWithIdentifier:str sender:self];

//In some other method:
[self performSegue:@"F21"];

SecondViewController.m 中的代码(视图 2):

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
if([[segue identifier] isEqualToString:@"F12"])
    UIViewController *v = [segue destinationViewController];
    [self dismissViewControllerAnimated:NO completion:nil];
    v = self;



-(void)performSegue:(NSString*)str
[self performSegueWithIdentifier:str sender:self];

- (IBAction)goBack:(id)sender 
[self performSegue:@"F12"];


我非常感谢任何帮助以了解为什么第一个 segue 有效而第二个无效。

谢谢,

院长

注意:这是完整的项目 - https://github.com/dean13-meet/firstiosApp 编辑:更新了 git。

【问题讨论】:

您的 github 项目缺少 getTextViewController .h 和 .m 文件。 你为什么还需要一个 back segue?这个功能是内置的!您收到错误消息是因为您关闭了您的 SecondVC,然后尝试从已关闭的 VC 中呈现一个新的 VC 不要使用 segue 从第二个视图控制器返回到第一个视图,只需使用您使用过的 [self dismissViewControllerAnimated:NO completion:nil] 方法。 【参考方案1】:

我不确定你在prepareForSegue 中要做什么,他们没有必要在那里解雇 VC。如果你想要一个简单的应用程序,从 VC1 到 VC2 然后再返回,最好的办法是使用segueunwindSegue

因此,在您的故事板控件中,从 VC1 上的按钮拖动到 VC2 并选择您的转场类型。然后在 VC1.m 中设置 unwind segue,例如:

 - (IBAction)unwindFromViewController:(UIStoryboardSegue *)segue
 
    //empty implementation
 

最后,在您的 VC2 控件中,从后退按钮拖动到 VC2 上的绿色退出图标,然后选择您的 unwindFromViewController 方法。

这应该可以满足您的需求。

【讨论】:

这行得通!但是,它不会保留在 VC2 中输入的信息 --- 我在 VC2 中有一个标签,每次我重新进入该视图时,标签都会重置其值。是否有可能使VC2在退出时保持不变?换句话说,保持相同的 Object 引用?【参考方案2】:

为了简单起见,我建议使用与模态相反的 push segue,因为它会为您处理所有后退按钮。但是,如果您不喜欢导航控制器的想法,请尝试使用以下命令关闭视图:Moving back from a Controller to a previous one

【讨论】:

以上是关于目标 C:后退按钮 segue 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Android Webview - 后退按钮不起作用

pushViewController 后后退按钮不起作用

为啥我的后退按钮在 iOS 7 上不起作用?

Android导航组件后退按钮不起作用

从 didSelectRowAtIndexPath 执行 segue 不起作用

自定义后退按钮图像在导航栏上不起作用