【发布时间】:2018-01-01 16:21:57
【问题描述】:
我正在开发一个具有 3 个主视图的应用程序,为了使用户能够通过滑动来更改 3 个视图(如 Tinder 应用程序),我创建了一个 PageViewController,它运行良好。这个 PageViewController 的工作原理如下。
- 当用户点击“登录”或“注册”按钮时,它会转到 PageViewController
- PageViewController 将 firstViewController 设置为初始 View
- 在PageViewController中,有3个方法分别是「getFirst」(获取第一个ViewController)、「getSecond」(获取第二个ViewController)、 「getThird」(获取第三个ViewController)。
我还在每 3 个视图的上方添加了按钮,并希望用户能够点击这些按钮以滑动到其他视图,就像他们滑动这些视图时一样(这也类似于 Tinder)。
所以为了实验,我在 SecondViewController 上添加了两个按钮。左边是移动到FirstViewController,右边是移动到ThirdViewController。 然后,在 SecondViewController 文件中,我添加了“UIPageViewControllerDelegate”,并尝试从 PageViewController 文件中调用左侧按钮的「getFirst」方法和右侧按钮的「getThird」方法。
但是当我点击左边的按钮时,我在 PageViewController 文件的「getFirst」方法行上收到了这个错误消息(我可能也会在右边的按钮上得到同样的错误)。
线程 1:致命错误:在展开可选值时意外发现 nil
代码如下。
页面视图控制器
import UIKit
class PageViewController: UIPageViewController {
override func viewDidLoad() {
super.viewDidLoad()
self.setViewControllers([getFirst()], direction: .forward, animated: true, completion: nil)
self.dataSource = self as UIPageViewControllerDataSource
}
}
extension PageViewController : UIPageViewControllerDataSource {
//FirstViewController
@objc func getFirst() -> FirstViewController {
return storyboard!.instantiateViewController(withIdentifier: "FirstViewController") as! FirstViewController
}
//SecondViewController
@objc func getSecond() -> SecondViewController {
return storyboard!.instantiateViewController(withIdentifier: "SecondViewController") as! SecondViewController
}
//ThirdViewController
@objc func getThird() -> ThirdViewController {
return storyboard!.instantiateViewController(withIdentifier: "ThirdViewController") as! ThirdViewController
}
func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? {
if viewController.isKind(of: ThirdViewController.self) {
// 3 -> 2
return getSecond()
} else if viewController.isKind(of: SecondViewController.self) {
// 2 -> 1
return getFirst()
} else {
// 1 -> end of the road
return nil
}
}
func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? {
if viewController.isKind(of: FirstViewController.self) {
// 1 -> 2
return getSecond()
} else if viewController.isKind(of: SecondViewController.self) {
// 2 -> 3
return getThird()
} else {
// 3 -> end of the road
return nil
}
}
}
第二视图控制器
import UIKit
class SecondViewController: UIViewController, UIPageViewControllerDelegate {
let pageHelper = PageViewController()
override func viewDidLoad() {
super.viewDidLoad()
pageHelper.delegate = self
}
@IBAction func toFirstTapped(_ sender: Any) {
pageHelper.getFirst()
}
}
我错过了什么?也许我不能让它以这种方式工作(我不能从其他文件中重用 PageViewController?)。
有人可以帮帮我吗!
【问题讨论】:
标签: ios swift uipageviewcontroller