我有三个导航控制器的根页面视图控制器,每个导航控制器最初导航到使用主表查看控制器。用户点击表后,会有一个segue,推送到另一个VC(带有详细信息表)。
转换样式是滚动。
工作正常。但是,我有以下效果:页面滚动无处不在。 我只需要在表vc中的用户之间滚动页面。左侧滑动详细信息表vc转到上一个导航控制器,而不是返回主表vc。
我需要做些什么来纠正所描述的行为? X-Code 5,iOS 7
更新:我可以通过在方法之前/之后在数据源返回nil来阻止页面转换,但滚动仍然显示在屏幕上。
当我尝试通过两种方式将datasource设置为nil来禁用滚动: 1)在pageViewController:didFinishAnimating)a有一个例外:由于未捕获的异常'NSInternalInconsistencyException'而终止应用程序,原因:'无效的参数不满足:[views count] == 3' 2)在willAppear / willDisapper中的主表vc中有一个例外:由于未捕获的异常'NSGenericException'而终止应用程序,原因:' * 集合< __ NSArrayM:0x8a445d0>在被列举时被突变。'
更新2:此处是我项目的链接:http://yadi.sk/d/MWmdA3XLCdn4U。按下带有“下载”图片的蓝色按钮即可获取该文件,或使用页面底部的语言切换器。
更新3:感谢大卫。他的解决方案正在运作另外:我只是在我的故事板中将Pan GR放在DetailTable VC上并将其链接到一个视图,没有任何代码行。
答案 0 :(得分:2)
我想到了两个想法:
子类UIPageViewController,在您的子类中提供了一种方法,可以将视图控制器数组从“真实”数组更改为当前可见数组。用户不会看到任何影响,但它会阻止页面控制器做任何事情。显然,当你回到根视图时,你告诉页面视图控制器撤消更改(交换回真实数组)
实现dataSource协议,并设置一个标志,以便在您想要阻止分页时,dataSource为下一个/上一个视图控制器返回nil。
注意:我没有使用pageController完成此操作,但我已经使用导航控制器做了类似的事情。
EDIT1:我玩过你的项目,是的,它不容易阻止滚动,但它是可能的。关键问题是页面控制器有一个托管页面的scrollview子视图。它中有一个平移手势识别器,用于识别拖动行为并对其进行响应。不幸的是,对于页面控制器的“滚动”变化,手势识别器不会被暴露。整个主题here on SO都有一个有趣的主题。
所以你有几个选择:
在子视图中查找滚动视图,找到手势识别器并禁用它。
禁用相同的scrollView
在推送第一个视图控制器后做一些花哨的技巧。但我的意思是,一旦动画结束,将该视图从子视图中拉出,从窗口中删除分页控制器,并将拉出的视图直接安装为根视图控制器。这可以使用,但由于偏移改变。您可能需要实际创建一个与窗口大小相同的透明视图,并先将拉出的视图插入其中。
添加您自己的平移手势识别器,然后忽略结果。因此,在任何视图中的viewDidLoad中,您不需要分页,请添加以下代码。它看起来效果很好。
代码:
UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(pan:)];
[self.view addGestureRecognizer:pan];
EDIT2: 执行此操作的首选方法是使用您自己的平移手势识别器,如上面的代码所示。你可以做的是当视图出现你不想激活分页控件时,在viewDidLoad中添加手势识别器。当用户导航回主视图时,该平移识别器将不会处于活动状态,并且页面控件将正常工作。我在你的演示项目中试过这个,它运行正常。
虽然其他方法可以起作用,但是如你所见,它更复杂。要更改scrollView或其识别器,您必须在页面视图子视图中进行探测,这是苹果公司所不喜欢的,并且很脆弱(这意味着它将来很容易破解)。您必须在子类中提供公共方法,并弄清楚如何获取对每个子视图的页面控件的引用。