TableViewController中的第二个segue创建与第一个相关的SIGABRT错误

时间:2016-08-04 22:37:11

标签: swift uitableview segue

我在一个更大的应用程序中创建了一个NoteBook应用程序。我有所有功能,包括一个添加注释页面的segue,它以编程方式触发单击注释(编辑它)或+ barButtonItem。

我需要第二个segue将用户发送回应用程序的主页,但我似乎尝试的每一种方式都与我现有的segue冲突。

任何人都可以建议让第二个segue工作的方法。它们都有不同的标识符,我在方法中引用它们。它只是goHome segue不起作用......

类NoteBookViewController:UITableViewController,NoteViewDelegate {

func didUpdateNoteWithTitle(newTitle: String, andBody newBody: String) {
    self.noteBookEntries[self.selectedIndex] ["title"] = newTitle
    self.noteBookEntries[self.selectedIndex] ["body"] = newBody

    self.tableView.reloadData()

    saveNotesArray()
}

var noteBookEntries = [[String:String]] ()

@IBAction func newNote() {

    var newNote = ["title" : "", "body" : ""]
    noteBookEntries.insert(newNote, at: 0)

    self.selectedIndex = 0

    self.tableView.reloadData()

    saveNotesArray()

    performSegue(withIdentifier: "editNoteBookSegue", sender: nil)
}

var selectedIndex = -1

func saveNotesArray() {

    UserDefaults.standard.set(noteBookEntries, forKey: "notes")
    UserDefaults.standard.synchronize()
}

override func viewDidLoad() {
    super.viewDidLoad()

    if let newNote = UserDefaults.standard.array(forKey: "notes") as? [[String:String]] {
        noteBookEntries = newNote
    }

    self.navigationItem.leftBarButtonItem = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.reply, target: self, action: #selector(NoteBookViewController.navigateToNextViewController))

}

func navigateToNextViewController(){
    self.performSegue(withIdentifier: "goHome", sender: self)
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
}

 override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return noteBookEntries.count
}

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell (withIdentifier: "CELL")! as UITableViewCell
    cell.textLabel?.text = noteBookEntries[indexPath.row]["title"]
    return cell
}

override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
    if editingStyle == UITableViewCellEditingStyle.delete {
        noteBookEntries.remove(at: indexPath.row)
        UserDefaults.standard.set(noteBookEntries, forKey: "notes")
        self.tableView.reloadData()
    }
}

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

    self.selectedIndex = indexPath.row

    performSegue(withIdentifier: "editNoteBookSegue", sender: nil)
}

    override func prepare(for segue: UIStoryboardSegue, sender: AnyObject?) {
    let notesEditorVC = segue.destination as! NewNoteBookEntryViewController

        notesEditorVC.navigationItem.title = noteBookEntries[self.selectedIndex] ["title"]
        notesEditorVC.noteBodyText = noteBookEntries[self.selectedIndex] ["body"]
        notesEditorVC.delegate = self

}

}

error message relating to original segue - this segue works until the second is added

2 个答案:

答案 0 :(得分:0)

prepareForSegue方法中,第一行是:

let notesEditorVC = segue.destination as! NewNoteBookEntryViewController

为每个segue调用此方法。当为你的第一个segue调用它时,它完全正常,因为目标视图控制器实际上是NewNoteBookEntryViewController类型。

但是,当为第二个segue调用此方法时,目标控制器的类型不同。所以,当你强迫它下降时,你会崩溃。

您应该为prepareForSegue方法添加一些逻辑,以便区分segues。例如:

if segue.identifier == "addNote" {
    let notesEditorVC = segue.destination as! NewNoteBookEntryViewController
    //some other code
}

答案 1 :(得分:0)

通过添加逻辑然后将其添加到目标控制器来解决:

override func viewWillAppear(animated: Bool) {   
   self.navigationController?.setNavigationBarHidden(true, animated: true) 
}