目标 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 然后再返回,最好的办法是使用segue
和unwindSegue
。
因此,在您的故事板控件中,从 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 不起作用的主要内容,如果未能解决你的问题,请参考以下文章