【问题标题】:Perform segue programmatically and still have it in the storyboard以编程方式执行 segue 并且仍然在故事板中
【发布时间】:2018-09-27 10:59:32
【问题描述】:

单击表格单元格后,我想从嵌入在导航控制器中的表格视图转到另一个视图控制器。我仍然希望将第二个视图控制器嵌入到同一个导航控制器中。因此,我通过情节提要创建了转场。

但是,我想在点击单元格后有条件地检查是否应该执行 segue。

我已经检查了方法shouldPerformSegueWithIdentifier,它可以满足我的需要,但不幸的是,它在表格点击处理程序之前执行。如果我删除故事板转场并仅通过performSegue 转场,我的第二个视图控制器将不再嵌入同一个导航控制器中。

有什么建议吗?

这是我的代码:

// Called on click event on table cell
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    tableView.deselectRow(at: indexPath, animated: true)
    let app = apps[indexPath.section]
    if app.state == .INSTALLED {
        let inputVC = self.navigationController?.viewControllers[1] as? InputVC
        inputVC?.app = app
        performSegue(withIdentifier: "showAccSync", sender: self)
    } else {
        // show alert
    }
}

【问题讨论】:

  • 如果您从 tableview 单元格的操作中触发 segue,那么 shouldPerformSegue 就是您想要的;但是你不应该在didSelectRowAt 中有任何代码,或者你可以从场景中的橙色视图控制器对象按住 ctrl-drag 到下一个场景,然后在didSelectRowAt 中使用performSegue 执行该segue
  • @Paulw11 感谢您的提示。当我更改以橙色 vc 对象为源的 segue 时,我从导航控制器获得 inputVC 的那一行让我越界了
  • 是的。那条线没有多大意义。你想通过访问导航控制器堆栈来实现什么?如果你试图访问新的视图控制器,你可以在prepareForSegue
  • 您从传递给 prepareFor: 函数的 segue 的目标属性中获取该引用。在您调用 performSegue 之前,目标视图控制器不存在
  • @Paulw11 成功了,谢谢

标签: ios swift segue uistoryboard


【解决方案1】:

您应该从视图控制器本身而不是单元格开始故事板转场。这样,如果您点击单元格,它就不会自动执行。

如果您想在不使用故事板转场的情况下将视图控制器推送到导航堆栈,请使用UINavigationController's pushViewController

if let secondVc = storyboard?.instantiateViewController(withIdentifier: "Second") {
    navigationController?.pushViewController(secondVc, animated: true)
}

【讨论】:

  • 谢谢!这正是我正在寻找的,不附加到单元格但可以通过编程方式触发的 segue。
  • 你拯救了我的一天!
【解决方案2】:

将故事板标识符分配给您的InputVC,例如"input_vc"。然后用故事板实例化它。然后推送到您的InputVC,它将在同一个导航堆栈上。

didSelectRow中的代码添加为:

然后使用情节提要实例化您的InputVC。然后推送到您的InputVC,它将在同一个导航堆栈上。

guard let inputVC = storyboard?.instantiateViewController(withIdentifier: "input_vc") as? InputVC else { return }
inputVC.app = app
self.navigationController?.pushViewController(secondVc, animated: true)

【讨论】:

    【解决方案3】:

    以编程方式,您可以这样做

    let lvc = storyboard?.instantiateViewController(withIdentifier: "yourViewController") as? yourViewController 
    self.navigationController?.pushViewController(lvc, animated: true)
    

    【讨论】:

      猜你喜欢
      • 2012-05-12
      • 2017-10-03
      • 2021-08-29
      • 1970-01-01
      • 2023-03-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多