Ios 从主视图调用与细节视图关联的segue

Ios 从主视图调用与细节视图关联的segue,ios,swift3,uinavigationcontroller,Ios,Swift3,Uinavigationcontroller,我有一个拆分视图控制器,主视图在导航栏上有一个“注释”按钮,该按钮应将包含已保存注释列表的视图(注释库视图控制器)推到详细视图上。在下面的屏幕截图中,“类别”是主视图,“事件列表”是详细视图。如您所见,“事件列表”和“备忘库”之间有一段距离 我想做的是当点击主视图上的“Note”按钮时,按下“Note Gallery”作为详细视图。到目前为止,我已经尝试使用委托/协议方法,协议在主视图中定义,在细节视图中实现。如果我调用self.performsgue来推送“备忘库”视图,“备忘库”视图不会显

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

我想做的是当点击主视图上的“Note”按钮时,按下“Note Gallery”作为详细视图。到目前为止,我已经尝试使用委托/协议方法,协议在主视图中定义,在细节视图中实现。如果我调用self.performsgue来推送“备忘库”视图,“备忘库”视图不会显示导航栏(即使我强制它使用setNavigationBarHidden和false值显示)。如果我从导航控制器(self.navigationController?.performsgue)调用performsgue,我会得到标识符未找到异常。我不想将Note按钮移动到Detail视图,因为我想使Note按钮可以从主视图访问。我如何解决这个问题,下面是我的代码摘录:

/* 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)
   }

}

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

在main.storyboard中,选择如图所示的序列,并在identity inspector中为其分配一个标识符,如图右上角所示

现在创建导航控制器并与主视图建立“根视图控制器”关系。然后使用
performsgue(标识符为“segue”,发送者为:nil)
移动到下一个视图控制器


希望我已经解决了你的问题

以下是我犯的错误:

获取标识符未定义错误的原因是导航控制器和“备忘库”视图之间未连接segue。它连接在“Note Gallery”视图和“Category Detail”视图之间,后者又连接到导航控制器。因此,没有为导航控制器定义标识符

之所以隐藏导航栏,是因为我没有将“备忘库”视图推到导航控制器上。相反,我只是打电话给prepare segue

解决方案:

这相当简单。我只需按下导航控制器上的“备忘库”视图,如下所示:

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

你真的在序列上设置了标识符吗?是的,我确实设置了标识符。这就是为什么我调用self.performsgue时它会起作用。问题是,导航栏没有显示。使用self.navigationController?.performsgue,我得到“原因:'接收器()没有标识符为'showNoteView''的序列”。我找到了罪魁祸首。这是因为segue没有直接连接到导航控制器。它连接到视图,视图又连接到导航控制器。因此,对于导航控制器,没有定义标识符。