#概要
日記帳のようなアプリを作る際にPageViewControllerを使って実装したが、
Outlet接続したUILabelが全てnilになってしまってハマったのでメモ。
PageViewControllerで必要なDelegateメソッド
func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? {
// 前のページを作る(ViewController)
// そのViewControllerにページ番号をセット
}
func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? {
//次のページを作って返す
//そのViewControllerにページ番号をセット
}
上記のメソッドで生成されるViewController(下の図の一番右)
class DiaryContentViewController: UIViewController {
var pageIndex :Int? {
didSet{
pageIndexLabel.text = "\(pageIndex)"
}
}
@IBOutlet weak var pageIndexLabel: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
}
やりたかったこと
- ページをめくった際に、ページ番号を更新
- 更新されたページ番号をコンテンツとなるViewControllerにセット
- セットされたタイミングでUILabelにセット
ここで問題が...
次(前)のページを返すメソッドでnilで落ちる...
原因
present/pushで画面遷移が行われてない状態だとアウトレット接続がまだ行われてないのでnilになる
解決策
override func viewDidLoad() {
super.viewDidLoad()
self.pageIndexLabel.text = "\(pageIndex!)"
}
コンテンツのとなるViewControllerのviewDidLoadで処理を行う