gpt4 book ai didi

swift - PageViewController 中的每个页面都有一个 UINavigationBar 标题

转载 作者:行者123 更新时间:2023-11-28 06:43:35 25 4
gpt4 key购买 nike

我已经用一组 ViewController 设置了我的 pageViewController(嵌入在 NavigationController 中)以用作页面(如下所示):

`
class PageViewController: UIPageViewController {

var arrayIndex: Int = 0
var navigationBar = UINavigationBar()
var pageControl = UIPageControl.self





override func viewDidLoad() {
super.viewDidLoad()

dataSource = self



if let firstViewController = orderedViewControllers.first {
setViewControllers([firstViewController],
direction: .Forward,
animated: true,
completion: nil)
}




}


// set up & order all view controllers

private(set) lazy var orderedViewControllers: [UIViewController] = {
return [self.newDayViewController("monday"),
self.newDayViewController("tuesday"),
self.newDayViewController("wednesday"),
self.newDayViewController("thursday")//,
self.newDayViewController("friday"),
self.newDayViewController("saturday"),
self.newDayViewController("sunday")
]


}()






// instantiate view controllers above that contain 'day' (easiest method to differentiate from other controllers)

private func newDayViewController(day: String) -> UIViewController {
return UIStoryboard(name: "Main", bundle: nil) .
instantiateViewControllerWithIdentifier("\(day)")
}


func pageViewController(pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) {
if (!completed) {
return
}

arrayIndex = Int(pageViewController.viewControllers!.first!.view.restorationIdentifier!)!


switch arrayIndex {

case 0:
navigationBar.topItem!.title = "Monday"
break

case 1:
navigationBar.topItem!.title = "Tuesday"
break

case 2:
navigationBar.topItem!.title = "Wednesday"
break

case 3:
navigationBar.topItem!.title = "Thursday"
default:
navigationBar.topItem!.title = "Timetable"


}
}








}


extension PageViewController: UIPageViewControllerDataSource {




func pageViewController(pageViewController: UIPageViewController, viewControllerBeforeViewController viewController: UIViewController) -> UIViewController? {
guard let viewControllerIndex = orderedViewControllers.indexOf(viewController) else {
return nil
}



let previousIndex = viewControllerIndex - 1


guard previousIndex >= 0 else {
return orderedViewControllers.last
}

guard orderedViewControllers.count > previousIndex else {
return nil
}

return orderedViewControllers[previousIndex]
}

func pageViewController(pageViewController: UIPageViewController,
viewControllerAfterViewController viewController: UIViewController) -> UIViewController? {
guard let viewControllerIndex = orderedViewControllers.indexOf(viewController) else {
return nil
}

let nextIndex = viewControllerIndex + 1
let orderedViewControllersCount = orderedViewControllers.count




//MARK: - determine which viewController the user is on



guard orderedViewControllersCount != nextIndex else {
return orderedViewControllers.first
}

guard orderedViewControllersCount > nextIndex else {
return nil
}

return orderedViewControllers[nextIndex]
}

func presentationCountForPageViewController(pageViewController: UIPageViewController) -> Int {
return orderedViewControllers.count
}

func presentationIndexForPageViewController(pageViewController: UIPageViewController) -> Int {
guard let firstViewController = viewControllers?.first,
firstViewControllerIndex = orderedViewControllers.indexOf(firstViewController) else {
return 0
}

return firstViewControllerIndex
}


}

`

我想知道如何让用户在浏览页面 View 时,UINavigationBar 的标题更改为他们正在查看的 View 的标题?例如:当用户查看 mondayViewController 时,标题是星期一,他们可以滑动到星期二,标题会改变等等。

欢迎提出建议

谢谢!

最佳答案

您的代码中存在一些错误,首先没有 UIPageViewControllerDelegate,因此永远不会调用委托(delegate)方法。

然后,我不知道你的PageViewController是否真的有一个UINavigationController。为了确保您可以通过选择您的 PageViewController 来嵌入它,并制作与图片中制作的相同的东西:

enter image description here

所以你可以在 Storyboard中看到 UINavigationControllerUIPageViewController,如下所示:

enter image description here

在你用每个 Storyboard ID 创建了一整天的 UIViewController 之后,例如星期一:

enter image description here

您可以像下面的代码一样修改您的代码:

   import UIKit
class PageViewController: UIPageViewController,UIPageViewControllerDelegate {
var arrayIndex: Int = 0
var pageControl = UIPageControl.self
private(set) lazy var orderedViewControllers: [UIViewController] = {
return [self.newDayViewController("monday"),
self.newDayViewController("tuesday"),
self.newDayViewController("wednesday"),
self.newDayViewController("thursday"),
self.newDayViewController("friday"),
self.newDayViewController("saturday"),
self.newDayViewController("sunday")
]
}()

override func viewDidLoad() {
super.viewDidLoad()

dataSource = self
delegate = self
if let firstViewController = orderedViewControllers.first {
self.navigationController!.navigationBar.topItem!.title = "monday"
setViewControllers([firstViewController],
direction: .Forward,
animated: true,
completion: nil)
}
}

private func newDayViewController(day: String) -> UIViewController {
return UIStoryboard(name: "Main", bundle: nil) .
instantiateViewControllerWithIdentifier("\(day)")
}

func pageViewController(pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) {
if (!completed) {
return
}

if let firstViewController = viewControllers?.first,
let arrayIndex = orderedViewControllers.indexOf(firstViewController) {
switch arrayIndex {
case 0:
self.navigationController!.navigationBar.topItem!.title = "Monday"
break

case 1:
self.navigationController!.navigationBar.topItem!.title = "Tuesday"
break

case 2:
self.navigationController!.navigationBar.topItem!.title = "Wednesday"
break

case 3:
self.navigationController!.navigationBar.topItem!.title = "Thursday"
default:
self.navigationController!.navigationBar.topItem!.title = "Timetable"


}
}
}
}
extension PageViewController: UIPageViewControllerDataSource {
func pageViewController(pageViewController: UIPageViewController, viewControllerBeforeViewController viewController: UIViewController) -> UIViewController? {
guard let viewControllerIndex = orderedViewControllers.indexOf(viewController) else {
return nil
}
let previousIndex = viewControllerIndex - 1
guard previousIndex >= 0 else {
return orderedViewControllers.last
}
guard orderedViewControllers.count > previousIndex else {
return nil
}
return orderedViewControllers[previousIndex]
}

func pageViewController(pageViewController: UIPageViewController,
viewControllerAfterViewController viewController: UIViewController) -> UIViewController? {
guard let viewControllerIndex = orderedViewControllers.indexOf(viewController) else {
return nil
}
let nextIndex = viewControllerIndex + 1
let orderedViewControllersCount = orderedViewControllers.count
//MARK: - determine which viewController the user is o
guard orderedViewControllersCount != nextIndex else {
return orderedViewControllers.first
}
guard orderedViewControllersCount > nextIndex else {
return nil
}
return orderedViewControllers[nextIndex]
}
func presentationCountForPageViewController(pageViewController: UIPageViewController) -> Int {
return orderedViewControllers.count
}
func presentationIndexForPageViewController(pageViewController: UIPageViewController) -> Int {
guard let firstViewController = viewControllers?.first,
firstViewControllerIndex = orderedViewControllers.indexOf(firstViewController) else {
return 0
}
return firstViewControllerIndex
}
}

关于swift - PageViewController 中的每个页面都有一个 UINavigationBar 标题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37203881/

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