swift - 从另一个视图控制器调用代码

时间:2016-02-13 01:10:47

标签: swift methods

我正在使用一个管理视图控制器之间滑动的库。

似乎我可以使用我的一个视图控制器中的按钮导航到另一个按钮的唯一方法是通过从管理滑动功能的视图控制器调用特定方法。

有没有办法在不同的视图控制器中调用方法?

谢谢

2 个答案:

答案 0 :(得分:0)

视图控制器之间的通信方式有很多种。在iOS上执行此操作的最常见模式之一是delegate pattern。一个视图控制器保存对另一个的引用,并且委托符合protocol。协议是第一个视图控制器在特定事件发生时可以调用的一组方法。我会尝试设置一个协议,让你的一个视图控制器成为另一个

的委托

答案 1 :(得分:0)

如果您查看GitHub上托管的代码,您可以看到页面控制器是从EZSwipeController类公开的。因此,假设您继承了EZSwipeController(或在某处维护引用),您现在可以访问它的pageViewController属性并滚动到给定页面。

如果你是子类:

class MyVC : EZSwipeController{
   func buttonTapped(){ /* use self.pageViewController to "page" */ }
}

奇怪的是,我从未亲自与UIPageViewController合作,据我所知,没有 easy 方式以简单的方式滚动到页面。

我没有亲自尝试过(我通常会在发布前验证我的答案),但是你应该可以把它拉下来。如果您没有对视图控制器的引用,则需要获取它(如果这是核心问题,请告诉我)。

关于UIPageViewController分页,有一个问题似乎很受欢迎:

  

UIPageViewController, how do I correctly jump to a specific page without messing up the order specified by the data source?

来自Apple docs

enter image description here

我还建议您查看EZSwipeController repo中的代码,在那里您可以找到一个执行滚动的非公开方法:

@objc private func clickedLeftButton() {
        let currentIndex = stackPageVC.indexOf(currentStackVC)!
        datasource?.clickedLeftButtonFromPageIndex?(currentIndex)

        let shouldDisableSwipe = datasource?.disableSwipingForLeftButtonAtPageIndex?(currentIndex) ?? false
        if shouldDisableSwipe {
            return
        }

        if currentStackVC == stackPageVC.first {
            return
        }
        currentStackVC = stackPageVC[currentIndex - 1]
        pageViewController.setViewControllers([currentStackVC], direction: UIPageViewControllerNavigationDirection.Reverse, animated: true, completion: nil)
    }

“关键”行是这一行:

pageViewController.setViewControllers([currentStackVC], direction: UIPageViewControllerNavigationDirection.Reverse, animated: true, completion: nil)

我认为EZSwipeController还公开了pageViewController中包含的视图控制器,它是一个名为stackVC的属性,它是页面视图控制器中包含的视图控制器的数组。

我假设有了这些知识你应该能够翻页到一个给定的页面,尽管看起来有点“hacky”(恕我直言,开发人员应该从一开始就暴露出分页逻辑)。

在这之后我的建议很简单:

尝试自己滚动它。这不是一项艰巨的任务,您可以完全控制可访问的内容以及您希望如何使用它。 EZSwipeController类非常小,因此您不必为自己的解决方案编写大量代码。你也可以继续分叉回购并根据自己的喜好修改/使用它。

我希望有所帮助。如果您有任何其他问题或者某些事情不清楚,我会随时帮您解决。