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

标签 swift uitableview segue

我在一个较大的应用程序中创建了一个笔记本应用程序。我拥有所有功能,包括转至“添加注释”页面,该页面通过单击注释(对其进行编辑)或 + barButtonItem 以编程方式触发。

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

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

类 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

最佳答案

在您的 prepareForSegue 方法中,第一行是:

let notesEditorVC = segue.destination as! NewNoteBookEntryViewController

每个 Segue 都会调用此方法。当第一次调用它时,它工作得很好,因为目标 View Controller 实际上是 NewNoteBookEntryViewController 类型。

但是,当为第二个 segue 调用此方法时,目标 Controller 的类型不同。因此,当你强制向下倾斜它时,你会发生崩溃。

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

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

关于swift - TableViewController 的第二个 segue 创建与第一个相关的 SIGABRT 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38778469/

相关文章:

ios - UITableView 使用实例方法

swift - 为 UIButton 调用发送者的方法

ios - 如何在 prepareForSegue iOS 上设置 imageView 图像?

iphone - 谁的 View 不在窗口层次结构中!问题

Swift 3.0 c 风格 for 循环中的多个条件

ios - 快速点击条形按钮项目时 UIFont 发生变化

iphone - UITableViewCell 中的 UITextField

ios - 自定义表格 View 单元格多行

ios - SceneKit 相机节点在捏手势时重置

Switch 语句中的字符串 : 'String' does not conform to protocol 'IntervalType'