@IBSegueAction有条件

时间:2019-06-23 11:09:38

标签: swift swiftui ibsegueaction

在我的应用中,我想基于UITapGestureRecognizer进行搜索。如果点击位于屏幕顶部,则应该对SettingsView进行设置。

在UIKit中,这非常简单。我通过将它包装在if语句中,在UITapGestureRecognizer中触发了performSegue。

现在,我想在SwiftUI中编写SettingsView()。 SettingsView()将嵌入在UIHostingController中。

我的问题是: 我如何对这个UIHostingController执行segue(同时告诉UIHostingController要显示哪个视图)?

我尝试使用新的@IBSegueAction。使用此@IBSegueAction的原因是我可以使用它来告诉UIHostingController显示哪个视图。问题是我现在不能插入条件。无论屏幕上的水龙头在哪里,都将执行搜索。我还没有找到一种方法来取消@IBSegueAction中的segue。

我的代码当前如下所示:

    @IBSegueAction func showSettingsHostingControler(_ coder: NSCoder, sender: UITapGestureRecognizer, segueIdentifier: String?) -> UIViewController? {

        let location = sender.location(in: self.tableView)
        if let _ = self.tableView.indexPathForRow(at: location) {
            return nil
        } else {
            if location.y < 32 {
                if location.x < view.bounds.midX {
                    direction = .left
                } else {
                    direction = .right
                }
                return UIHostingController(coder: coder, rootView: SettingsView())
            }
        }

        return nil
    }

当前结果是,当水龙头在错误的区域时,该应用会锁定到不存在的Nil视图。

1 个答案:

答案 0 :(得分:0)

  

基于UITapGestureRecognizer。如果水龙头在屏幕的顶部

在我看来,您的点击手势识别器已连接到错误的视图。这里不应该做出任何决定。将视图放置在屏幕顶部,然后将点击手势识别器连接到该视图。这样,如果此视图被点击,则无需做出任何决定:点击在正确的位置。