【问题标题】:Invoking a segue associated with the Detail View from the Main View从主视图调用与详细视图关联的 segue
【发布时间】:2017-12-14 11:35:02
【问题描述】:

我有一个拆分视图控制器,主视图在导航栏上有一个“注释”按钮,该按钮应将包含已保存注释列表的视图(注释库视图控制器)推送到详细视图。在以下屏幕截图中,“类别”是主视图,“事件列表”是详细视图。如您所见,“事件列表”和“笔记库”之间有一个segue。

当点击主视图上的“笔记”按钮时,我想要将“笔记库”作为详细视图推送。到目前为止,我已经尝试使用委托/协议方法,其中协议在主视图中定义,并在详细视图中实现。如果我调用 self.performSegue 来推送“Note Gallery”视图,“Note Gallery”视图不会显示导航栏(即使我使用 setNavigationBarHidden 强制它显示为 false 值)。如果我从导航控制器 (self.navigationController?.performSegue) 调用 performSegue,我会得到 identifier not found 异常。我不想将 Note 按钮移动到 Detail 视图,因为我想让 Note 按钮可以从 Main View 访问。我该如何解决这个问题,这是我的代码的摘录:

/* Master View */

// Define delegate for updating children views
protocol ChildViewDelegate: class {
   func pushInNoteView()
}

class MasterViewController: UITableViewController, NSFetchedResultsControllerDelegate  {
   weak var delegate: ChildViewDelegate?

   // Handles tapping on Note button
   @IBAction func noteTapped(_ sender: UIBarButtonItem) {
    // Push Note View onto any active detailed view
      self.delegate?.pushInNoteView()

   }
}

/* Detail View */
extension CategoryDetailTableViewController: ChildViewDelegate {
   func pushInNoteView() {
      // This approach does not show navigation bar
      self.performSegue(withIdentifier: "showNoteView", sender: self)

      // This approach gives identifier not found exception
      self.navigationController?.performSegue(withIdentifier: "showNoteView", sender: self)
   }

}

【问题讨论】:

  • 你真的在segue上设置了标识符吗?
  • 是的,我确实设置了标识符。这就是为什么当我调用 self.performSegue 时它起作用的原因。问题是,导航栏没有显示。使用 self.navigationController?.performSegue,我得到“原因:'Receiver () 没有标识符 'showNoteView'' 的 segue”。

标签: ios swift3 uinavigationcontroller


【解决方案1】:

我认为问题在于您没有在 main.storyboard 中为您的 segue 提供标识符。

Here is how to do it. 在您的 main.storyboard 中选择您的 segue,如图所示,并在身份检查器中为其分配一个标识符,如图右上角所示。

现在创建导航控制器并与您的主视图建立“根视图控制器”关系。然后使用performSegue(withIdentifier: "segue", sender: nil) 移动到下一个视图控制器。

希望我已经解决了您的问题!

【讨论】:

  • 我找到了罪魁祸首。这是因为 segue 没有直接连接到导航控制器。它连接到视图,而视图又连接到导航控制器。所以对于导航控制器,没有定义标识符。
【解决方案2】:

这是我犯的错误:

我收到 identifier not defined 错误的原因是导航控制器和“Note Gallery”视图之间没有连接 segue。它连接在“Note Gallery”视图和“Category Detail”视图之间,后者又连接到导航控制器。因此,没有为导航控制器定义标识符。

导航栏隐藏的原因是因为我没有将“Note Gallery”视图推送到导航控制器上。相反,我只是在调用 prepare segue。

解决方案:

这很简单。我只是像这样在导航控制器上推送“Note Gallery”视图:

if let noteVC = storyboard?.instantiateViewController(withIdentifier: "NoteGalleryView") {
            self.navigationController?.pushViewController(noteVC, animated: true)
        }

【讨论】:

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