Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/104.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 在导航控制器推送的VC上禁用页面转换_Ios_Uipageviewcontroller - Fatal编程技术网

Ios 在导航控制器推送的VC上禁用页面转换

Ios 在导航控制器推送的VC上禁用页面转换,ios,uipageviewcontroller,Ios,Uipageviewcontroller,我有三个导航控制器的根页面视图控制器,每个导航控制器最初通过主表导航到视图控制器。用户单击表格后,会出现一个序列,推送到另一个VC(带有详细表格) 过渡样式为滚动 很好。但是,我有以下效果:页面滚动无处不在。 只有当用户在vc表中时,我才需要在页面之间滚动。向左滑动详细表vc,转到上一个导航控制器,而不是返回主表vc 我需要做什么来纠正所描述的行为? X代码5,iOS 7 Upd:我可以通过在datasource的before/after方法中返回nil来防止页面转换,但是滚动仍然显示在屏幕上

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

过渡样式为滚动

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

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

Upd:我可以通过在datasource的before/after方法中返回nil来防止页面转换,但是滚动仍然显示在屏幕上

当我试图通过两种方式将datasource设置为nil来禁用scroll时: 1) 在pageViewController:didFinishAnimating)中,a有一个异常:由于未捕获的异常“nsInternalInconsistenceException”而终止应用程序,原因:“无效参数不满足:[视图计数]==3” 2) 在主表vc中的WillAspect/WillUnsipper中有一个异常:由于未捕获的异常“NSGenericeException”而终止应用程序,原因:“*集合在枚举时发生了变异。”

Upd 2:此处是指向我的项目的链接:。按下带有“下载”图片的蓝色按钮以获取文件,或使用页面底部的语言切换器


UPD3:谢谢大卫。他的解决办法奏效了。此外:我只需将Pan-GR放在故事板中的DetailTable VC处,并将其链接到一个视图,无需任何代码行。

我想到了两个想法:

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

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

注意:我没有使用pageController完成这项工作,但我使用导航控制器完成了类似的工作

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

因此,您有几个选择:

  • 在子视图中查找滚动视图,找到手势识别器,然后禁用它

  • 禁用相同的滚动视图

  • 在按下第一个视图控制器后,执行一些奇特的操作。但我的意思是,动画结束后,将该视图从子视图中拉出,从窗口中移除分页控制器,并将拉出的视图直接安装为根视图控制器。这可以实现,但因为偏移量会发生变化。您可能需要实际创建一个与窗口大小相同的透明视图,并首先在其中插入拉伸视图

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

代码:

编辑2: 实现这一点的首选方法是使用您自己的平移手势识别器,如上面的代码所示。您可以做的是,当视图显示您不想激活分页控件时,在viewDidLoad中添加手势识别器。当用户导航回主视图时,pan识别器将不会激活,页面控件将正常工作。我用你的演示项目试过了,效果很好


虽然其他方法也可以发挥作用,但正如你所看到的,它更为复杂。要更改scrollView或其识别器,您必须在页面视图子视图中进行探测,这是Apple不赞成的,而且是脆弱的(意味着它在将来可能很容易崩溃)。您必须在子类中提供公共方法,并找出如何获取对每个子视图的页面控件的引用。

我可以阻止在前/后滚动,但滚动仍在显示,但转换不起作用。哈-这是一个很好的理由-因此您可以用奖励吸引开发人员。看,把一个非常简单的演示项目放在一起,演示这个问题,然后把它上传到dropbox这样的公共场所。然后像我这样的人会试图找到一个解决方案——这是一个有趣的问题,其他人总有一天会遇到(抑制分页)。同样,花时间回答问题是一个很好的理由,有了50分的奖金,你会得到一个狂热的开发人员试图提供一个令人兴奋的答案!用项目链接更新了我的问题。按下带有下载图片的蓝色按钮以获取文件,PleaseVid,我试图禁用PageVC的滚动视图-结果是导航滚动(按顺序)也被禁用。
UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(pan:)];
[self.view addGestureRecognizer:pan];