【问题标题】:perform segue from pageViewController从 pageViewController 执行 segue
【发布时间】: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 已正确连接,上面现在是我的实际错误日志的图像 - 我从未见过/设置 speedspeedVariance,并且找不到任何以编程方式写入的任何地方任何代码-.- 现在将尝试下面的答案马特!

标签: ios swift xcode segue uipageviewcontroller


【解决方案1】:

不要为此使用 UIPageViewController。这很讽刺,因为我通常是第一个建议使用 UIPageViewController 的人。但是在这种情况下,它为您做了太多的工作,您不能以按照您描述的方式自定义它的方式进行干预。您将需要使用一个简单的分页 UIScrollView;这样,您将完全负责所发生的事情,通过滚动视图的委托获得细粒度的响应,并且您将可以访问底层的平移手势识别器并可以修改其行为。

【讨论】:

    猜你喜欢
    • 2017-12-06
    • 2018-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-24
    • 2018-12-05
    • 1970-01-01
    相关资源
    最近更新 更多