Ios 更改页面视图控制器(Swift)中VC的索引

Ios 更改页面视图控制器(Swift)中VC的索引,ios,swift,uipageviewcontroller,Ios,Swift,Uipageviewcontroller,使用下面的代码,我在一个页面视图控制器中嵌入了一系列视图控制器。我就是找不到一种方法通过按下一个条形按钮来切换到另一个视图控制器。我计划为每个视图控制器中的每个栏按钮图标编写一个单独的函数 class PageViewController: UIPageViewController, UIPageViewControllerDataSource, UIPageViewControllerDelegate { private var pages: [UIViewController]!

使用下面的代码,我在一个页面视图控制器中嵌入了一系列视图控制器。我就是找不到一种方法通过按下一个条形按钮来切换到另一个视图控制器。我计划为每个视图控制器中的每个栏按钮图标编写一个单独的函数

class PageViewController: UIPageViewController, UIPageViewControllerDataSource, UIPageViewControllerDelegate {

    private var pages: [UIViewController]!

    override func viewDidLoad() {
        super.viewDidLoad()

        self.dataSource = self
        self.delegate = self

        self.pages = [
            self.storyboard!.instantiateViewControllerWithIdentifier("FirstNav") as! UINavigationController,
            self.storyboard!.instantiateViewControllerWithIdentifier("SecondNav") as! UINavigationController,
            self.storyboard!.instantiateViewControllerWithIdentifier("ThirdNav") as! UINavigationController,
            self.storyboard!.instantiateViewControllerWithIdentifier("FourthNav") as! UINavigationController
        ]

        let startingViewController = self.pages.first! as UIViewController
        self.setViewControllers([startingViewController], direction: .Forward, animated: false, completion: nil)
    }

    func pageViewController(pageViewController: UIPageViewController, viewControllerAfterViewController viewController: UIViewController) -> UIViewController? {
        let index = (self.pages as NSArray).indexOfObject(viewController)

        // if currently displaying last view controller, return nil to indicate that there is no next view controller
        return (index == self.pages.count - 1 ? nil : self.pages[index + 1])
    }

    func pageViewController(pageViewController: UIPageViewController, viewControllerBeforeViewController viewController: UIViewController) -> UIViewController? {
        let index = (self.pages as NSArray).indexOfObject(viewController)

        // if currently displaying first view controller, return nil to indicate that there is no previous view controller
        return (index == 0 ? nil : self.pages[index - 1])
    }

}

每个控制器是否需要嵌入到
UINavigationController
中?您可以让一个
UINavigationController
嵌入一个
UIViewController
,该视图控制器引用一个
pageviewcontroller
和一个
barButtonItem
,当点击
barButtonItem
时触发一个动作,告诉
pageviewcontroller
更改索引


或者,如果您想执行当前的行动计划,即每个
UINavigationController
中的
barButtonItem
,请使用委托方法
didselectBarbuttonaIndex
或其他方法编写协议,然后为每个
UINavigationController
提供委托属性,使
pageviewcontroller
符合协议,并成为每个导航控制器的代表。然后,当点击一个条形按钮时,调用委托方法,这将使页面控制器更改其索引。

PageViewController的实现更改为以下内容(我对已经实现的方法做了一些更改,并添加了一个新的实例方法。)

  • 一个
    iAction
    ,您可以将每个条形按钮项目连接到它。根据故事板的设置方式,您可能需要更改此方法的主体

    @IBAction func barButtonTapped(sender: UIBarButtonItem) {
    
        var newIndex = -1
    
        switch sender.title! {
        case "First":
            newIndex = 0
        case "Second":
            newIndex = 1
        case "Third":
            newIndex = 2
        case "Fourth":
            newIndex = 3
        default: break
        }
    
        self.parentPageViewController.displayPageForIndex(newIndex)
    }
    

  • 您正在尝试从哪个视图控制器切换到哪个视图控制器,您尝试将bar按钮放在哪里?上面的代码是页面视图控制器的代码。所有子视图控制器中都有条形码,因为它们有不同的按钮。我需要从第一导航到第三导航等等。是的,每个视图控制器都有自己的导航控制器。我将每个条形按钮添加到每个视图控制器中的自定义视图中,而不是导航控制器。因为我知道哪个按钮对应于哪个页面,所以我放弃了整个
    开关
    语句。
    .displayPageForIndex()
    方法成功了。非常感谢!假设我有一个导航控制器数组,就像我现在做的一样,但是在页面视图控制器之外还有一个单独的视图控制器。由于我不能直接从页面视图控制器中分离,是否可以在页面视图控制器中实例化这个单独的VC,并从另一个VC切换到现有的导航控制器阵列@恩德梅里
    weak var parentPageViewController: PageViewController!
    
    @IBAction func barButtonTapped(sender: UIBarButtonItem) {
    
        var newIndex = -1
    
        switch sender.title! {
        case "First":
            newIndex = 0
        case "Second":
            newIndex = 1
        case "Third":
            newIndex = 2
        case "Fourth":
            newIndex = 3
        default: break
        }
    
        self.parentPageViewController.displayPageForIndex(newIndex)
    }