视图控制器第二次启动后,Superview 为 Nil

Posted

技术标签:

【中文标题】视图控制器第二次启动后,Superview 为 Nil【英文标题】:Superview is Nil after Second Launch of View Controller 【发布时间】:2012-07-03 16:39:25 【问题描述】:

我已经花了几个小时,我无法弄清楚这一点。我有一个在此处启动的详细视图控制器 (UITableView):

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 

    EventLocationDetailController *newDetailViewController = [[EventLocationDetailController alloc] initWithNibName:@"EventLocationDetailController" bundle:nil];
    self.eventDetailController = newDetailViewController;
    [self.navigationController pushViewController:self.eventDetailController animated:YES];

    [newDetailViewController release];


在详细视图控制器中有一个按钮方法,它调用以下方法来显示确认用户选择的滑入滑出动画:

-(void)confirmLastActionWithMessage:(NSString *)message 

ConfirmActionViewController  *newConfirmActionViewController = [[ConfirmActionViewController alloc] initWithNibName:@"ConfirmActionViewController" bundle:nil];
self.confirmActionViewController = newConfirmActionViewController; 
[newConfirmActionViewController release];

[[self.view superview] addSubview:self.confirmActionViewController.view];

ConfirmActionViewController调用的协议方法,表示动画结束。

-(void)didFinishConfirmDisplay:(UIView *)viewToRemoveFromSuperview 

     [viewToRemoveFromSuperview removeFromSuperview];

这在我第一次按下按钮时效果很好。如果我弹出细节控制器并将其推回堆栈并再次按下按钮,则不会发生任何事情,并且此后每次调用该方法时,细节控制器的超级视图都为零。细节视图的viewWillAppear 方法中的Superview 不为零,只有当它到达confirmLastActionWithMessage 方法时。两者之间不会发生其他用户交互。如何找回超级视图?我有一个类似的代码,没有动画。

我还注意到,从堆栈弹出时,详细视图控制器没有调用 dealloc。不知道问题出在哪里。

谢谢。

编辑 1

好的。我用这个替换了 addSubview 行:

[self.view insertSubview:self.confirmActionViewController.view atIndex:0];

并且动画视图出现在其中一个表格单元格的下方。其中一个表格单元格是否可以窃取超级视图?

【问题讨论】:

您的房产是什么样的?具体来说,您是否在属性中添加了自定义逻辑? @property (nonatomic, 保留) ConfirmActionViewController *confirmActionViewController; 实现,而不是声明。你有@synthesize 或别的什么吗? 是的,我有@synthesize confirmActionViewController; 我认为你第一次就做对了。您不想将视图添加到 UITableView(假设要添加它的视图是 UITableView)。 【参考方案1】:

好吧,我真的不明白为什么要将子视图添加到父视图。为什么不将它添加到 self.view 中

我可能无法解释为什么没有超级视图,但尝试将控制器视图添加到 self.view 或

[[[[UIApplication sharedApplication] delegate] window] addSubview:yourview];

这会将视图呈现在所有内容之上。

【讨论】:

我试过了,但由于视图底部的工具栏,我不得不调整动画的起点。动画将出现在其他视图中 - 带有和不带有工具栏。我希望代码可以移植,并且可以启动动画,而无需计算每次使用时屏幕底部的位置。如果我没有得到另一个答案,看起来这可能是唯一的选择。谢谢。 使用可能的情况创建一个新枚举,您必须计算动画的起点,如工具栏、工具栏、导航栏等。然后修改您的方法 -(void)confirmLastActionWithMessage:(NSString *)message 以获取额外的参数该枚举类型并计算开关块内的起点。调用方法时,根据需要传递参数。这将使您的代码更具可移植性。

以上是关于视图控制器第二次启动后,Superview 为 Nil的主要内容,如果未能解决你的问题,请参考以下文章

当我第二次启动应用程序时标签消失

第二次推送视图控制器xamarin ios后需要触摸以与tableview交互

Swift 5 - 用户第二次单击标签栏按钮后,需要帮助在视图控制器 1 上重新加载 Web 视图

添加 SubView 后在 SuperView 中获取 Touches

应用程序第二次启动时显示不同的视图

UIView 仅在第二次调用后显示