dismissModalViewControllerAnimated 重置 contentOffset
Posted
技术标签:
【中文标题】dismissModalViewControllerAnimated 重置 contentOffset【英文标题】:dismissModalViewControllerAnimated resets contentOffset 【发布时间】:2011-09-18 08:06:56 【问题描述】:我的表格视图有问题。当关闭显示在其顶部的模态视图控制器时,它总是滚动到顶部。我曾尝试使用 KVO 观察对 contentOffset
的更改,但是让我的观点混乱的那个在它后面。
从UITableViewController
,当用户在模态对话框中完成他的任务时,self.tableView.contentOffset
是,我调用:
[self dismissModalViewControllerAnimated:YES]
随后,当调用viewWillAppear:(BOOL)animated
时,self.tableView.contentOffset
已经设置为 0,0。
这应该发生吗?我可以通过在显示模态视图之前记住滚动位置并在关闭模态视图后将其恢复回 viewWillAppear 来解决此问题。但这似乎是错误的。我错过了什么吗?
我发现Dismiss modal view changes underlying UIScrollView中描述的类似问题。
【问题讨论】:
你能检查一下viewDidLoad:
在关闭模态视图后是否被调用? (我注意到这可能在内存警告期间发生,即使视图被推送,某些组件也会被卸载)。
babbidi 有一个很好的观点,如果出现内存警告,您的视图可能会在模态视图位于顶部时被卸载。如果您在 viewDidLoad 方法中初始化表视图,并且在模态视图期间出现内存警告,那么当您关闭模态视图时,表视图可能会重新初始化。将 NSLogs 放在 viewDidUnload 和 viewDidLoad 中。
我已经在监视 viewDidUnload
- 不,视图没有卸载。
【参考方案1】:
看起来这是 UITableViewController 的默认行为。我在非常简单的应用程序中对其进行了测试,它的工作原理与您所说的完全一样。如果您不喜欢它,请改用 UIViewController。
【讨论】:
感谢您确认我的怀疑。我开始质疑自己;-) @Split 我有 UIViewController 但这个问题仍然可以重现【参考方案2】:这是我解决此问题的方法,以便表格视图保持原始滚动位置。在我的UITableViewController
子类中,我添加了:
@property (assign) CGPoint lastScrollPosition;
然后在实现中,我覆盖了以下内容:
- (void)viewWillAppear:(BOOL)animated
self.tableView.contentOffset = self.lastScrollPosition;
- (void)dismissModalViewControllerAnimated:(BOOL)animated
self.lastScrollPosition = self.tableView.contentOffset;
[super dismissModalViewControllerAnimated:animated];
如果您希望表格最初显示为滚动到非零位置,就像我所做的那样,请不要忘记在您的 viewDidLoad
中初始化 lastScrollPosition
。
【讨论】:
感谢 Palimondo 的帖子。你为我解决了一个确切的问题!以上是关于dismissModalViewControllerAnimated 重置 contentOffset的主要内容,如果未能解决你的问题,请参考以下文章