未触发自定义segue的展开

时间:2016-11-06 15:44:49

标签: ios swift segue uistoryboardsegue unwind-segue

问题

我的问题是即使单击后退按钮也不会触发展开过程。

我的代码

我有一个类1stViewController,它使用自定义segue到2ndViewController。自定义segue如下:

override func perform() {
    let sourceVC = self.source as! 1stViewController
    let destinationVC = self.destination as! 2ndViewController
    sourceVC.addChildViewController(destinationVC)
    sourceVC.view.addSubview(destinationVC.view)
}

在我的2ndViewController中,我添加了一个按钮,触发一个展开的segue回到1stViewController。展开segue通过2ndViewController中的展开segue触发出口的标识符连接。因此,我创建了一个IBAction,它将unwind segue出口连接到:

@IBAction func unwindToFeed(segue: UIStoryboardSegue) {}

我已将unwind segue的标识符设置为等于按钮的action函数中使用的标识符

func handleActionBackButton(){
    print("here")
    self.performSegue(withIdentifier: "unwindId", sender: self)
}

单击按钮时会打印“此处”,但似乎performSegue不是。

我猜我也需要一个自定义的unwindSegue类,所以我创建了unwindSegueEventToFeed:

class unwindSegueEventToFeed: UIStoryboardSegue {

override func perform() {
    let sourceVC = self.source as! 2ndViewController
    let destinationVC = self.destination as! 1stViewController

    let sourceView = sourceVC.view as UIView!
    let destView = destinationVC.view as UIView!

    let window = UIApplication.shared.keyWindow
    window?.insertSubview(destView!, aboveSubview: sourceView!)
    sourceVC.dismiss(animated: false, completion: nil)
}

} ...在2ndViewController中调用:

override func segueForUnwinding(to toViewController: UIViewController, from fromViewController: UIViewController, identifier: String?) -> UIStoryboardSegue? {
    return unwindSegueEventToFeed(identifier: identifier, source: fromViewController, destination: toViewController)
}

关于触发放卷过程我必须做些什么的任何线索?

1 个答案:

答案 0 :(得分:0)

我让你的榜样像这样工作。 ViewController是第一个视图控制器; ViewController2是第二个视图控制器:

class ViewController: UIViewController {
    @IBAction func unwindToFeed(_ segue: UIStoryboardSegue) {
        let child = self.childViewControllers[0]
        child.willMove(toParentViewController: nil)
        child.view.removeFromSuperview()
        child.removeFromParentViewController()
    }
}

class MySegue: UIStoryboardSegue {
    override func perform() {
        let sourceVC = self.source as! ViewController
        let destinationVC = self.destination as! ViewController2
        sourceVC.addChildViewController(destinationVC)
        sourceVC.view.addSubview(destinationVC.view)
        destinationVC.view.frame = sourceVC.view.bounds
        destinationVC.view.autoresizingMask = [.flexibleHeight, .flexibleWidth]
        destinationVC.didMove(toParentViewController: sourceVC)
    }
}

class ViewController2 : UIViewController {
}

请注意,unwindToFeed是<并且必须位于第一个视图控制器中。将它放在第二个视图控制器中是没有意义的,因为第二个视图控制器是展开的,而不是目的地

现在我想就问题和答案发表一些意见:

  • 这是一个iOS 10示例。在iOS 10中永远不会永远调用segueForUnwinding;它在iOS 8之后被放弃,随后被弃用。

  • 相当于segueForUnwinding的iOS 9/10是unwind(for:towardsViewController:)。我确实试过实现它,但我发现它是在ViewController2中调用的,而不是在ViewController中调用的。我认为这是iOS 10中的一个错误,并且正在向Apple报告。