UIPageViewController 中的相同 UIViewControllers
Posted
技术标签:
【中文标题】UIPageViewController 中的相同 UIViewControllers【英文标题】:Same UIViewControllers in UIPageViewController 【发布时间】:2018-08-13 15:12:50 【问题描述】:我需要一个 UIPageViewController 来显示与数组中可用数据一样多的 UIViewController。 假设我有一个 Int 数组,对于每个 Int,我希望 UIViewController 在 UILabel 中显示其中一个。 为此,我在主情节提要中创建了 UIPageViewController 和 UIViewController 及其 UILabel。
这是我为 UIPageViewController 编写的代码:
import UIKit
import RealmSwift
class PageViewController: UIPageViewController, UIPageViewControllerDataSource
lazy var subViewControllers: [UIViewController] =
return [
self.createNewVC(withName: "CounterViewController"),
self.createNewVC(withName: "CounterViewController"),
self.createNewVC(withName: "CounterViewController")
]
()
var dataArray: [Int] = [30, 134, 345]
override func viewDidLoad()
super.viewDidLoad()
self.dataSource = self
setViewControllers([subViewControllers[0]], direction: .forward, animated: true, completion: nil)
// Creates a new ViewController
func createNewVC(withName name: String) -> UIViewController
return UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: name)
// Returns the previous ViewController
func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController?
let currentIndex: Int = subViewControllers.index(of: viewController) ?? 0
if (currentIndex <= 0)
return nil
if let previous = subViewControllers[currentIndex - 1] as? CounterViewController
previous.daysLeftLabel.text = String(dataArray[currentIndex])
return previous
else
return nil
// Returns the next ViewController
func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController?
let currentIndex: Int = subViewControllers.index(of: viewController) ?? 0
if (currentIndex >= subViewControllers.count - 1)
return nil
if let next = subViewControllers[currentIndex + 1] as? CounterViewController
next.daysLeftLabel.text = "0"
return next
else
return nil
这是 UIViewController 的代码
import UIKit
class CounterViewController: UIViewController
@IBOutlet weak var daysLeftLabel: UILabel!
override func viewDidLoad()
super.viewDidLoad()
// Do any additional setup after loading the view.
override func didReceiveMemoryWarning()
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
注意:“CounterViewController”也是 UIViewController StoryBoardID
问题是,当我第一次向右滚动时,应用程序在 next.daysLeftLabel.text = "0"
这一行崩溃,说它在展开 Optional 时发现了一个 nil 值。
我在这里做错了什么?
我也想借此机会问一些事情。 在这种情况下,您可能已经猜到了,我使用的是 UIPageViewController,它拥有相同的 UIViewControllers 但显示的数据不同,这是实现此目的的最佳方法?我这样做是正确的还是有更简单、更清洁的方法?
【问题讨论】:
【参考方案1】:这条线崩溃了
next.daysLeftLabel.text = "0"
因为daysLeftLabel
在 VC 加载之前为零,所以您需要
class CounterViewController: UIViewController
@IBOutlet weak var daysLeftLabel: UILabel!
var sendedText = ""
override func viewDidLoad()
super.viewDidLoad()
daysLeftLabel.text = sendedText
// Do any additional setup after loading the view.
然后使用
next.sendedText = "0"
【讨论】:
这确实解决了我的问题,谢谢!顺便说一句,这是一个有效的实现吗?来自 android,我永远不会创建将显示在标签中的变量 这是发送值的唯一方法以上是关于UIPageViewController 中的相同 UIViewControllers的主要内容,如果未能解决你的问题,请参考以下文章
uipageviewcontroller 中的 Swift uipageviewcontroller
NavigationController 中的 UIPageViewController
UIPageViewController 中的 UIScrollView 滚动了多少?