UINavigationController 停止推送视图
Posted
技术标签:
【中文标题】UINavigationController 停止推送视图【英文标题】:UINavigationController stops pushing view 【发布时间】:2011-06-28 01:22:42 【问题描述】:我们使用导航控制器和视图控制器向用户显示问题。一切正常,但我们进行了一些 UI 调整,以便我们可以将应用程序移植到 iPad,唯一的更改是使表格视图的框架动态地在 iphone 或 ipad 上。然而,现在当我们从 335 个问题中找到第 187 个问题时,它不再推送新问题......它推送一个空白屏幕,并且推送视图控制器的“viewDidLoad”方法永远不会被调用,因为它已经过去了187 次。我们设置了断点来确保导航控制器和视图控制器仍然分配在内存中。
这是每次新推送都会调用的视图控制器的 viewDidLoad...
- (void)viewDidLoad
_tableView = [[QuestionTableView alloc] initWithFrame:self.view.frame style:UITableViewStyleGrouped];
_tableView.center = CGPointMake(self.view.center.x, self.view.frame.size.height/2);
[_tableView setDataSource:self];
[_tableView setQuestionDelegate:self];
[_tableView setDelegate:self];
_tableView.scrollEnabled = YES;
[_tableView setBackgroundView:[[[UIView alloc] init] autorelease]];
_tableView.directionalLockEnabled = YES;
_tableView.delaysContentTouches = NO;
_tableView.backgroundColor = [UIColor clearColor];
_tableView.opaque = NO;
[self.view addSubview:_tableView];
我们通过...推送视图控制器
[questionsNavigationController pushViewController:viewController animated:YES];
提前致谢! :)
【问题讨论】:
也只是想提一下,如果我们在模拟器中运行它没有问题......如果我们在 ipad 或 ipad2 上运行它,我们就会遇到上面列出的问题 导航堆栈上有 187 个视图控制器?我会从那里开始...... 不是同一个控制器被推送不同的表数据。 那么它的视图应该已经加载了。 是的,这可以工作 187 次......但是如果我们将表格视图缩小,我们可以通过整个 335...... 【参考方案1】:如果你把 tableview 变小,你可以通过整套 335 个问题吗?您是否为每个问题创建一个 ViewController ?
您可以使用仪器运行项目以检查内存泄漏。
【讨论】:
它使用不同的表数据推送同一个视图控制器,因此我们重用视图控制器视图,但从数组中的不同对象填充它。 问题 187 的数据中是否有一些特殊的东西会破坏问题详细信息 viewController ?你说你把tableView 变小了,你到底做了什么? 只需将uitableview的框架设置为更小【参考方案2】:您真的需要堆栈上的所有问题吗? popViewControllerAnimated:NO 在推送下一个之前如何,还带有动画:NO?
它可以在模拟器上运行,因为它的内存就是 PC 的内存。将 NSLog 放入您的 -didReceiveMemoryWarning 方法以查看其内存不足。
【讨论】:
【参考方案3】:您可能不应该以这种方式使用 NavigationController。太……丑了。
我会做以下事情之一:
"pop" ViewControllers 落后 5-10 个视图(使用 setViewController)。换句话说 - 保持 5-10 个视图落后,其他的将被释放(并保存结果)。一旦用户决定返回(并且堆栈中有 3-4 个视图),再重建几个。 自己实现 NavigationController 行为 - 只需替换视图而不是堆叠它们。用户返回后,使用所需数据重新加载视图。 如果您真的认为您的实现没问题 - 尝试从您的视图中释放尽可能多的内存,一旦事情变得很热。【讨论】:
以上是关于UINavigationController 停止推送视图的主要内容,如果未能解决你的问题,请参考以下文章
UISplitViewController 在尝试使用其中的 UINavigationController 后停止自动旋转
对于UINavigationController和UIViewController,在swift 4中禁用屏幕方向