2016-08-04 3 views
0

大きなアプリ内でNoteBookアプリケーションを作成しました。私は、ノートを編集するためにノートをクリックしたり、+ barButtonItemをクリックしたりすることをプログラマチックにトリガーするAdd Noteページへのsegueを含むすべての機能を持っています。最初のものに関連するSIGABRTエラーを作成するTableViewControllerの2番目の部分

ユーザーをアプリのホームページに戻すには2番目のセグが必要ですが、私が試してみたすべての方法で、既存のセグーと競合しているようです。

誰かがセカンドセグを働かせる方法を提案できますか?それらはどちらも私がこのメソッドで参照している異なる識別子を持っています。動作しません。そのちょうど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 

} 

}あなたprepareForSegue方法最初の行で

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

+0

がストーリーボードに追加し、しかし、ちょうど同じエラーが表示されます –

答えて

0

は次のとおりです。

let notesEditorVC = segue.destination as! NewNoteBookEntryViewController 

このメソッドは、各セグに対して呼び出されます。あなたの最初のsegueのために呼び出されるとき、宛先ビューコントローラは実際にはタイプNewNoteBookEntryViewControllerであるので、完全に正常に動作します。

ただし、このメソッドが2番目のセグに呼び出されると、宛先コントローラのタイプが異なります。だから、あなたがダウンキャストしたときにクラッシュする。

prepareForSegueメソッドにロジックを追加して、セグを区別する必要があります。例えば:先コントローラにこれを付加しロジックを追加することによって解決

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

それは一歩近づいています - 今私はホーム画面に戻りますが、TableViewControllerのナビゲーションバーはまだ画面の上部に表示されています...これを強制的に行う方法はありますか解雇? –

+0

あなたのナビゲーションバーのタイトルを更新していない可能性があります。あなたは "addNote" segueのためにこれをやっています - あなたの2番目のsegueのためにそれを行うコードを挿入してください。これで問題が解決しない場合 - githubを通じてコードを共有できますか? –

0

:私もbarButtonItemに連結された `@IBActionのfunc`を用いて試みた

override func viewWillAppear(animated: Bool) { 
    self.navigationController?.setNavigationBarHidden(true, animated: true) 
} 
関連する問題