视图控制器第二次启动后,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 视图