从 UINavigationBar 弹出视图控制器时出现 UIScrollView 错误

Posted

技术标签:

【中文标题】从 UINavigationBar 弹出视图控制器时出现 UIScrollView 错误【英文标题】:UIScrollView error when pop view controller from UINavigationBar 【发布时间】:2014-02-10 14:35:00 【问题描述】:

我有这个带有分页 UIScrollView 的视图控制器。具体来说,这个滚动视图有 3 页,我希望它从第二页开始。因此,当视图加载时,我将内容偏移量调整为从第二页开始:

CGFloat offsetX = _pageWidth * SECOND_PAGE;
[_scrollView setContentOffset:CGPointMake(offsetX, 0) animated:YES];

但是当我点击 UINavigationBar 中的“返回”按钮,并且 UIScrollView 不在第二页时,就会发生错误。

堆栈跟踪显示导航控制器删除了视图,deallocs,在滚动视图中调用方法 removeFromSuperview,然后 UIScrollView 调用 adjustContentoffsetIfNeccesary--->notifyDidScroll。所以我认为发生的事情是 UIScrollView 想要通知 UIScrollView 委托发生了滚动,但委托已经被释放,并且发生了EXC_BAD_ACCESS

那么,有谁知道实现我想要的行为的正确方法是什么?

这是我谈到的堆栈跟踪:

#1  0x0075595b in -[UIScrollView(UIScrollViewInternal) _notifyDidScroll] ()
#2  0x0073fc43 in -[UIScrollView setContentOffset:] ()
#3  0x0075ccae in -[UIScrollView(UIScrollViewInternal) _adjustContentOffsetIfNecessary] ()
#4  0x00758b46 in -[UIScrollView(UIScrollViewInternal) _stopScrollingNotify:pin:tramplingDragFlags:] ()
#5  0x00758bda in -[UIScrollView(UIScrollViewInternal) _stopScrollingNotify:pin:] ()
#6  0x0074069e in -[UIScrollView removeFromSuperview] ()
#7  0x0071a715 in -[UIView dealloc] ()
#8  0x00718124 in -[UIView release] ()

谢谢。

【问题讨论】:

您是否尝试过启用僵尸? ***.com/questions/5386160/… 我也有同样的问题,请问有解决方法吗?谢谢 【参考方案1】:

你可以清除_scrollView的委托;

[_scrollView setContentOffset:CGPointMake(offsetX, 0) animated:NO];

当动画结束时,scrollViewDidScroll 被调用,你可以使用_scrollView 的委托,但它被释放,变成了一个野指针。

【讨论】:

以上是关于从 UINavigationBar 弹出视图控制器时出现 UIScrollView 错误的主要内容,如果未能解决你的问题,请参考以下文章

UINavigationBar 弹出进出而不是滑动

UINavigationBar titleTextAttributes 从视图控制器返回后未更新

从 UIPageViewContoller 中包含的视图设置 UINavigationBar 标题

从多个视图向 UINavigationBar 添加和删除 UIBarButtonItems

如何从第一个视图控制器中的第二个 UIView 控制器中删除 UINavigationBar label.text?

如何禁用 UINavigationBar 上的向右滑动手势?