0

我有带有三个导航控制器的根页面视图控制器,每个控制器最初都导航到带有主表的视图控制器。用户点击表格后,会出现一个带有推送到另一个 VC(带有详细信息表)的 segue。

过渡样式为滚动。

它工作正常。但是,我有以下效果:页面滚动无处不在。只有当用户在表 vc 中时,我才需要在页面之间滚动。向左滑动详细表 vc 会转到上一个导航控制器,而不是返回主表 vc。

我需要做什么来纠正所描述的行为?X 代码 5,iOS 7

更新:我可以通过在方法之前/之后在数据源返回零来防止页面转换,但滚动仍然显示在屏幕上。

当我尝试通过两种方式将数据源设置为 nil 来禁用滚动时:1) 在 pageViewController:didFinishAnimating) 中出现异常:由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“无效参数不满足:[查看次数] = = 3' 2) 在 willAppear/willDisapper 的主表 vc 中并有一个异常:由于未捕获的异常“NSGenericException”而终止应用程序,原因:“ * Collection <__NSArrayM: 0x8a445d0> 在枚举时发生了突变。”

更新 2:这里是我的项目的链接:http: //yadi.sk/d/MWmdA3XLCdn4U。按带有“下载”图片的蓝色按钮以获取文件,或使用页面底部的语言切换器。

更新 3:感谢大卫。他的解决方案正在奏效。另外:我只是在我的故事板中将 Pan GR 放置在 DetailTable VC 中并将其链接到一个视图,而无需任何代码行。

4

1 回答 1

2

想到两个想法:

  • 子类 UIPageViewController,并在您的子类中提供一种将视图控制器数组从“真实”数组更改为当前可见数组的方法。用户不会看到任何影响,但它会阻止页面控制器做任何事情。显然,当您返回根视图时,您告诉页面视图控制器撤消更改(交换回真实数组) .

  • 实现 dataSource 协议,并设置一个标志,以便当您想要阻止分页时,dataSource 为下一个/上一个视图控制器返回 nil。

注意:我没有使用 pageController 完成此操作,但我使用导航控制器完成了类似的操作。

EDIT1:我玩过你的项目,是的,阻止滚动并不容易,但这是可能的。关键问题是页面控制器有一个滚动视图子视图来托管页面。它有一个平移手势识别器来识别拖动行为并做出响应。不幸的是,对于页面控制器的“滚动”变体,手势识别器没有公开。在 SO上有一个关于整个主题的有趣线程。

所以你有几个选择:

  • 在子视图中查找滚动视图,找到手势识别器并将其禁用。

  • 禁用相同的滚动视图

  • 推第一个视图控制器后做一些花哨的技巧。但我的意思是,一旦动画结束,将该视图拉出子视图,从窗口中移除分页控制器,并将拉出的视图直接安装为根视图控制器。这可以工作,但由于偏移量发生了变化。您可能需要实际创建一个与窗口大小相同的透明视图,然后首先将拉取的视图插入其中。

  • 添加您自己的平移手势识别器,然后忽略结果。因此,在任何不想分页的视图中的 viewDidLoad 中,添加下面的代码。它似乎工作得很好。

代码:

UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(pan:)];
[self.view addGestureRecognizer:pan];

EDIT2:首选的方法是使用您自己的平移手势识别器,如上面的代码所示。您可以做的是当视图出现您不想激活分页控件时,在 viewDidLoad 中添加手势识别器。当用户导航回主视图时,该平移识别器将不会处于活动状态,并且页面控件将正常工作。我用你的演示项目试过这个,效果很好。

虽然可以使其他方法起作用,但如您所见,它更复杂。要更改 scrollView 或其识别器,您必须在页面视图子视图中进行探索,这是 Apple 不赞成的,并且很脆弱(这意味着它将来很容易损坏)。您必须在子类中提供公共方法,并弄清楚如何获取对每个子视图的页面控件的引用。

于 2013-11-13T15:14:47.597 回答