【发布时间】:2017-01-31 19:30:08
【问题描述】:
我的问题如下:我正在使用 pageViewControllers 为我正在创建的应用程序创建教程/入职页面。在我的教程的最后(第 3 页)上的左滑手势应该会执行转场。
这是我目前所拥有的,但它给了我一个键值编码遵从性错误。我对我的插座进行了两次、三次检查,swipeView 的连接非常正确。
class GrowController: UIViewController {
@IBOutlet weak var swipeView: UIView!
override func viewDidLoad() {
super.viewDidLoad()
view.addSubview(swipeView)
createGesture()
}
func createGesture() {
let showReg = UISwipeGestureRecognizer(target: self, action: #selector(showRegister))
showReg.direction = .left
self.swipeView.addGestureRecognizer(showReg)
}
func showRegister(gesture: UISwipeGestureRecognizer) {
performSegue(withIdentifier: "showRegister", sender: self)
}
}
这是实际UIViewController(正在显示的特定页面)的控制器
现在我还尝试在我的TutorialViewController 中弄乱一些逻辑,即UIPageViewController 控制滑动表单页面到页面等。
这里的逻辑
class TutorialViewController: UIPageViewController, UIPageViewControllerDelegate, UIPageViewControllerDataSource {
var viewControllerIndex: Int?
//Array of my pages to load (GrowController is page3)
lazy var tutorialArray: [UIViewController] = {
return [self.tutorialInstance(name: "page1"), self.tutorialInstance(name: "page2"), self.tutorialInstance(name: "page3")]
}()
private func tutorialInstance(name: String?) -> UIViewController {
return UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: name!)
}
override func viewDidLoad() {
super.viewDidLoad()
self.dataSource = self
self.delegate = self
if let firstViewController = tutorialArray.first {
setViewControllers([firstViewController], direction: .forward, animated: false, completion: nil)
}
}
// Scroll view
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
for view in self.view.subviews {
if view is UIScrollView {
view.frame = UIScreen.main.bounds
}
else if view is UIPageControl {
view.backgroundColor = UIColor.clear
}
}
}
// Page View Controller delegate functions
public func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? {
guard let viewControllerIndex = tutorialArray.index(of: viewController) else {
return nil
}
let previousIndex = viewControllerIndex - 1
guard previousIndex >= 0 else {
return nil
}
guard tutorialArray.count > previousIndex else {
// Added this line just testing around, nothing happened here though.
performSegue(withIdentifier: "ShowRegister", sender: self)
return nil
}
return tutorialArray[previousIndex]
}
public func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? {
guard let viewControllerIndex = tutorialArray.index(of: viewController) else {
return nil
}
let nextIndex = viewControllerIndex + 1
guard nextIndex < tutorialArray.count else {
return nil
}
guard tutorialArray.count > nextIndex else {
return nil
}
return tutorialArray[nextIndex]
}
public func presentationCount(for pageViewController: UIPageViewController) -> Int {
return tutorialArray.count
}
public func presentationIndex(for pageViewController: UIPageViewController) -> Int {
guard let firstViewController = viewControllers?.first, let firstViewControllerIndex = tutorialArray.index(of: firstViewController) else {
return 0
}
return firstViewControllerIndex
}
}
是否与willTransitionTo pageView 委托方法有关?我不熟悉如何实现,我试过了。
我认为我可以将一个 subView 添加到 Grow 控制器,在其中放置一个滑动手势,并在用户从该页面向左滑动时执行一个 segue。截至目前,此代码在加载 page3 时使应用程序崩溃 (GrowController)
非常感谢任何帮助,我已经尝试解决这个问题超过一周了,这是我提出的关于该主题的第二个问题。谢谢!
【问题讨论】:
-
让我检查一下我是否了解您想要做什么。您希望用户能够滑动-滑动-滑动以通过页面视图控制器的三个页面,然后如果用户再次滑动,我们就离开这里?对吗?
-
没错!除了它从第一页开始,它只是轻扫,然后从 page3 开始的第三次轻扫将继续!但是是的,这就是确切的概念
-
segues 是否从 GrowController 正确连接到下一个控制器? (通过故事板或以编程方式)。另外,您能否发布您获得的实际错误日志。
-
mark,是的,segues 已正确连接,上面现在是我的实际错误日志的图像 - 我从未见过/设置
speed或speedVariance,并且找不到任何以编程方式写入的任何地方任何代码-.- 现在将尝试下面的答案马特!
标签: ios swift xcode segue uipageviewcontroller