2011-09-18 61 views
7

我的表格视图有问题。当解除其上的模态视图控制器时,它总是滚动到顶部。我试着用KVO观察contentOffset的变化,但是我认为弄乱了我的观点的那个变种落后了。dismissModalViewControllerAnimated重置contentOffset

UITableViewController,当用户完成他的任务在模态对话框,self.tableView.contentOffset是,我称之为:

[self dismissModalViewControllerAnimated:YES] 

随后,当viewWillAppear:(BOOL)animated被调用时,self.tableView.contentOffset已设置为0,0。

这是应该发生?我可以通过在呈现模态视图之前记住滚动位置来解决该问题,并在解除模态视图后将其恢复到viewWillAppear中。但这似乎是错误的。我错过了什么吗?

我发现在Dismiss modal view changes underlying UIScrollView中描述的类似问题。

+1

你可以检查'viewDidLoad:'在解散模态视图后被调用吗? (我注意到这可能发生在内存警告期间,即使视图被按下,一些组件也被卸载)。 –

+0

babbidi有一个很好的观点,如果出现内存警告,您的视图可以在模态视图处于最前面时卸载。如果您在viewDidLoad方法中初始化表格视图,并且在模态视图中存在内存警告,那么当您关闭模态视图时,表格视图可能会重新初始化。把NSLogs放在viewDidUnload和viewDidLoad中。 – MattyG

+0

我已经在监视'viewDidUnload' - 不,视图没有被卸载。 – Palimondo

回答

5

它看起来像这是UITableViewController的默认行为。我测试它在非常简单的应用程序,它的工作完全按照你所说的。如果你不喜欢它,请改用UIViewController。

+0

感谢您确认我的怀疑。我开始怀疑自己;-) – Palimondo

+0

@Split我有UIViewController但仍然可以重现 – iOSdev

5

下面是我如何解决此问题,以便表视图保持原始滚动位置。在我的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

+0

感谢Palimondo的帖子。你为我解决了一个确切的问题! –