从入职/教程屏幕执行 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:) 但我不知道它是否值得麻烦。也许只是在它前面放另一个视图,然后在该视图中放一个滑动手势识别器视图,然后使用识别的手势手动更改页面或切换到新控制器。
我正在使用 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:) 但我不知道它是否值得麻烦。也许只是在它前面放另一个视图,然后在该视图中放一个滑动手势识别器视图,然后使用识别的手势手动更改页面或切换到新控制器。