gpt4 book ai didi

ios - 页面 View Controller 中 VC 的更改索引(Swift)

转载 作者:搜寻专家 更新时间:2023-10-31 22:49:45 27 4
gpt4 key购买 nike

使用以下代码,我将一系列 View Controller 嵌入到我正在滑动的页面 View Controller 中。我只是找不到通过按下条形按钮来切换到另一个 View Controller 的方法。我计划为每个 View Controller 中的每个栏按钮图标编写一个单独的函数。

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])
}

}

最佳答案

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

class PageViewController: UIPageViewController, UIPageViewControllerDataSource, UIPageViewControllerDelegate {

private var pages: [UINavigationController]!

private var currentPageIndex: Int!

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
]

(self.pages[0].topViewController as! FirstViewController).parentPageViewController = self
(self.pages[1].topViewController as! SecondViewController).parentPageViewController = self
(self.pages[2].topViewController as! ThirdViewController).parentPageViewController = self
(self.pages[3].topViewController as! FourthViewController).parentPageViewController = self

self.currentPageIndex = 0
let startingViewController = self.pages.first! as UINavigationController
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)
self.currentPageIndex = index

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

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

// 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])
}



func displayPageForIndex(index: Int, animated: Bool = true) {
assert(index >= 0 && index < self.pages.count, "Error: Attempting to display a page for an out of bounds index")

// nop if index == self.currentPageIndex
if self.currentPageIndex == index { return }

if index < self.currentPageIndex {
self.setViewControllers([self.pages[index]], direction: .Reverse, animated: true, completion: nil)
} else if index > self.currentPageIndex {
self.setViewControllers([self.pages[index]], direction: .Forward, animated: true, completion: nil)
}

self.currentPageIndex = index
}

}

现在,在您的每个 subview Controller 中,添加两段代码:

  1. 维护对父 PageViewController 实例的弱引用的属性。

    weak var parentPageViewController: PageViewController!
  2. 一个IBAction,您可以将每个条形按钮项连接到该IBAction。您可能需要根据 Storyboard 的设置方式更改此方法的主体。

    @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)
    }

关于ios - 页面 View Controller 中 VC 的更改索引(Swift),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31361156/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com