如何使用swift 3

时间:2017-02-18 23:24:55

标签: swift storyboard segue xib

我最难找到答案。

我有一个xib视图,位于视图控制器内的scrollview中。在xib中我有一个带动作的按钮,我需要转到我在故事板中的视图控制器。我也希望能够使用自定义的segue。

到目前为止,我已经读过我可以从故事板中实例化viewcontroller来实现它。但后来我不知道如何呈现该控制器。

感谢您的帮助...

更新:

这是我用来执行segue的代码。

在父ViewController中:

    static var referenceVC: UIViewController?


override func viewDidLoad() {
    super.viewDidLoad()
    print("viewdidload")
    LevelSelectViewController.referenceVC = self

    setupScrollView()
}
xib视图文件中的代码

        let vc = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "sightWordController")

        let parent = LevelSelectViewController.referenceVC!

        let segue = InFromRightCustomSegue(identifier: "test", source: parent, destination: vc)


        segue.perform()

1 个答案:

答案 0 :(得分:3)

如评论中所述,Segues通常仅限于使用documentation中所述的故事板使用情况。您可以通过@IBDesignable类似方法在故事板中实现自定义xib视图,并让您从xib加载到storyboard文件/类中。这样,您就可以获得两个世界的好处。否则,您可能希望以另一种方式处理此问题(例如delegates / target-action事件等)。

您也可以爬上responder chain并通过获取对VC的引用来调用与故事板中加载的VC相关的segue(segue不必附加到任何特定操作)并调用segue。您可以通过以下示例代码的方式爬上响应链:

protocol ChildViewControllerContainer {
    var parentViewController: UIViewController? { get }
}


protocol ViewControllerTraversable {
    func viewController<T: UIViewController>() -> T?
}

extension UIView: ViewControllerTraversable {

    func viewController<T: UIViewController>() -> T? {
        var responder = next

        while let currentResponder = responder {
            guard responder is T else {
                responder = currentResponder.next
                continue
            }

            break
        }

        return responder as? T
    }
}

extension UITableViewCell: ChildViewControllerContainer {
    weak var parentViewController: UIViewController? {
        return viewController() as UIViewController?
    }
}