【发布时间】:2014-04-14 03:19:59
【问题描述】:
我遇到了一个问题,我认为这是由于我错误地删除了我的视图。我将尝试解释并希望所有人都能遵循。
我有一个UISplitview 应用程序,它基本上有两个视图。主要细节视图,以及本质上是地图的视图。在表中选择某个字符串后,调用此代码(此代码在详细视图中,但rainObject 是从UIViewController 传入的。
-(void)setReceivedRainObject:(id)receivedRainObject{
if ([receivedRainObject isEqualToString:@"Test"]){
mapViewController *mapView=[[mapViewController alloc]initWithNibName:@"mapViewController" bundle:nil location:0];
[self.navigationItem setHidesBackButton:NO animated:NO];
[self.navigationController setNavigationBarHidden:NO animated:YES];
[self.navigationController pushViewController:mapView animated:NO];
}
}
所以上面的代码按预期在细节屏幕中加载了我的地图。
但是,当我从左侧视图控制器单击第一个选项(测试)时,它会调用一个新的视图控制器(viewcontroller2 具有名为 test2 的行)并且第二个控制器调用第三个(viewcontroller3 具有名为 test3 的行)
在 viewcontoller3 的 viewDidDisappear 和测试的 viewWillAppear 上我有这个代码
[self.detailViewController.navigationController popViewControllerAnimated:NO];
所以当我深入到 viewcontroller 时,当我单击后退按钮时,它会弹出一个地图,而当 testview 加载时它会弹出第二个。让我的详细视图显示我是如何开始的。 但是,我注意到,如果我单击“测试”按钮两次并尝试返回,则会出现一个“额外的屏幕”,应该用 pop 删除。想知道如何删除这么多视图或阻止程序添加这么多视图。 谢谢
【问题讨论】:
-
您获得了额外的屏幕,因为您已按两次 mapView - 每次触摸测试按钮一次。我不确定您要实现什么导航,但对我来说听起来不正确。听起来您的按钮应该只在详细视图中显示一个新的视图控制器,而不是按下它。在
ViewWillAppear和viewDidDisappear中调用popViewController无疑为我敲响了警钟。如果通过您的应用导航不使用视图堆栈,请不要使用导航控制器 -
@Paulw11 当我单击按钮时,我的按钮必须显示带有地图的视图,否则如何在不推动的情况下完成此操作。呈现和推动之间有什么区别。其次,当我完成它时不会弹出你做什么来摆脱它?
-
您不必使用导航控制器。你在使用故事板吗?如果是这样,您可以在基本 detailviewcontroller 和新控制器之间创建一个替换 segue,为其命名,然后使用
[detailViewController performSegueWithIdentifier:]触发它 -
弹出是您对导航控制器所做的事情,因为它是一堆视图,但它不是在应用程序中管理视图的唯一方法,如果您的应用程序不是自然地导航为堆栈视图然后它可能会妨碍
-
无论堆栈多深,它都会弹出到根视图控制器。导航控制器不会保留视图。它们是否真正被释放取决于任何其他对象是否仍然持有引用。您可以在应用程序运行时在 XCode 中查看内存图,或使用 Instruments 工具监控内存使用情况并查看对象是否“滞留”
标签: ios objective-c uiviewcontroller