如何使用 uiviewcontroller/storyboard 上的 uibutton 在 uipageviewcontroller 中推进页面

Posted

技术标签:

【中文标题】如何使用 uiviewcontroller/storyboard 上的 uibutton 在 uipageviewcontroller 中推进页面【英文标题】:How to advance page in uipageviewcontroller with uibutton on uiviewcontroller/storyboard 【发布时间】:2016-11-30 23:04:25 【问题描述】:

我有一个非常具体的用例,我想知道是否有人处理过。我想在我的第一次用户体验 UIPageViewController 上添加一个“继续”按钮。这篇文章 (Swift ios: how to trigger next page using buttons),如果你想让它出现在每一页上,但我不打算这么广泛的使用。

我有一个 UIPageViewController 和 6 个视图控制器,我目前可以通过滑动浏览它们。

我尝试将按钮连接到视图控制器作为 segue,但它显示在 PageViewController 之外。我曾想过尝试在按钮单击上从右向左滑动,但我无法解决这个问题。

任何人都知道如何攻击将单个按钮放在一个视图控制器上并让它前进到 UIPageViewController 中的下一个视图控制器?


这被标记为重复,但在 SO 上没有此问题的重复案例。类似的很少,但没有什么像它。有的话请给个链接。当前链接的版本是对类似问题的 obj-c 答案,没有解释如何将所需的功能链接到视图控制器。这个答案我可以很容易地实现为一个全局按钮,但它没有涵盖单个视图控制器按钮。

谢谢


编辑最终代码解决方案。

所以这是一个用 swift 3 编码的两部分解决方案。

在uipageviewcontroller数据源扩展中,翻页的func构建如下。

func goNextPage() 
   let cur = self.viewControllers![0]
   let p = self.pageViewController(self, viewControllerAfter: cur)
   self.setViewControllers([p!], direction .forward, animated: true, completion: nil)
  

单个视图控制器中的部分构建如下

@IBAction func nextPageButtonWasTapped(_ sender: Any) 
  var candidate: UIViewController = self
  while true 
    if let pageViewController = candidate as? MyUIPageViewController 
        pageViewController.goNextPage()
        break
    
    guard let next = parent else  break 
    candidate = next
  

【问题讨论】:

你的问题真的和UIPageControl有关吗,还是你的标题有问题? 对不起,编辑到uipageviewcontroller 看看this是否回答了你的问题。 我不这么认为。我不确定如何将 viewcontroller 内部的按钮连接回 uipageviewcontroller。这才是我问题的真正根源。从那里我可以使用上面的答案来调用 uipageviewcontroller 中的函数来向前或向后,但我无法到达那里。 【参考方案1】:

遍历视图控制器层次结构以找到页面视图控制器。当你找到它时,让它翻页:

@IBAction func nextPageButtonWasTapped(_ sender: AnyObject?) 
    var candidate: UIViewController = self
    while true 
        if let pageViewController = candidate as? UIPageViewController 
            candidate.navigateForward()
            break
        
        guard let next = parentViewController else  break 
        candidate = next
    

UIPageViewController 的扩展中实现navigateForward,基于来自this answer 的Objective-C 版本。

【讨论】:

感谢您的回复!我已经在扩展中构建了转到下一页的功能,但无法让它们连接。我认为你让我走上了正确的道路。当我实现这个时,我得到一个错误,说“'UIViewcontroller'类型的值没有成员'goNextPage'”所以看起来它没有将候选变量转换为页面视图控制器。 我弄清楚了上面的问题。我正在转换为通用页面视图控制器,而不是具有我构建的扩展和功能的自定义视图控制器。现在我已经连接了,只需要让扩展功能正常工作。我将您的答案标记为已解决。再次感谢!

以上是关于如何使用 uiviewcontroller/storyboard 上的 uibutton 在 uipageviewcontroller 中推进页面的主要内容,如果未能解决你的问题,请参考以下文章

如何使用本机反应创建登录以及如何验证会话

如何在自动布局中使用约束标识符以及如何使用标识符更改约束? [迅速]

如何使用 AngularJS 的 ng-model 创建一个数组以及如何使用 jquery 提交?

如何使用laravel保存所有行数据每个行名或相等

如何使用 Math.Net 连接矩阵。如何使用 Math.Net 调用特定的行或列?

WSARecv 如何使用 lpOverlapped?如何手动发出事件信号?