从入职/教程屏幕执行 segue

Perform segue from onboarding / tutorial screen

我正在使用 UIPageViewController 作为入门/教程屏幕,我的问题如下:

当用户在教程的最后一页时,我想要一个向左滑动的手势,而不是尝试滑动页面控制器,而是执行到注册页面的 segue。我在本教程的最后一页的 UIViewController 中的 viewDidLoad 中添加了一条打印语句,它进行了注册。

在同一个 viewDidLoad 中,我创建了我的手势来执行 segue,但没有任何反应。我什至尝试将 performSegue 放在 viewDidLoad 中,但什么也没发生。我将我的 segue 连接到 UIPageViewController 以及我的 GrowController,但都没有注册。我不知所措!

这是教程最后一页的UIViewController

class GrowController: UIViewController {

override func viewDidLoad() {
    super.viewDidLoad()
    print("*********************************")
    createGesture()
    // performSegue(withIdentifier: "ShowRegister", sender: self)
}


func createGesture() {
    let showReg = UISwipeGestureRecognizer(target: self, action: #selector(showRegister))
    showReg.direction = .left
    view.addGestureRecognizer(showReg)
}


func showRegister(gesture: UISwipeGestureRecognizer) {
    performSegue(withIdentifier: "showRegister", sender: self)
}

}

这是处理教程逻辑的UIPageViewController

class TutorialViewController: UIPageViewController, UIPageViewControllerDelegate, UIPageViewControllerDataSource {

    var viewControllerIndex: Int?

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()
    if let image = UIImage(named: "export.png") {
        view.backgroundColor = UIColor.init(patternImage: image)
    } else {
        print("Error")
    }

    self.dataSource = self
    self.delegate = self

    if let firstViewController = tutorialArray.first {
        setViewControllers([firstViewController], direction: .forward, animated: false, completion: nil)
    }
}

这些是委托函数和数据源函数

// 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 {
        performSegue(withIdentifier: "ShowRegister", sender: self)  // Added this line just testng around, nothing happend here though.
        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
}

很多代码可能是一个简单的答案。

tl;dr - 如何让滑动手势从 UIPageViewController

的特定页面执行转场

有一个您可以实现的委托方法 pageViewController(_:willTransitionTo:) 但我不知道它是否值得麻烦。也许只是在它前面放另一个视图,然后在该视图中放一个滑动手势识别器视图,然后使用识别的手势手动更改页面或切换到新控制器。