2016-08-04 4 views
0

큰 응용 프로그램 내에서 NoteBook 응용 프로그램을 만들었습니다. 나는 모든 기능을 segue를 포함하여 메모 추가 페이지에 프로그래밍 방식으로 메모 (편집) 또는 + barButtonItem 클릭 트리거합니다.첫 번째와 관련된 SIGABRT 오류를 만드는 TableViewController의 두 번째 부분

사용자를 앱의 홈 페이지로 되돌리려면 두 번째 세그가 필요합니다. 그러나 내가 시도한 모든면에서 기존의 세그와 충돌합니다.

누구나 두 번째 섹스를 작동시키는 방법을 제안 할 수 있습니까? 둘 다 메소드에서 참조하는 식별자가 다릅니다. 작동하지 않습니다 그것의 단지 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 

} 

} 당신의 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 유형이므로 완전히 작동합니다.

그러나이 방법을 두 번째 세그먼트에 호출하면 대상 컨트롤러의 유형이 달라집니다. 따라서 강제로 다운시킬 때 충돌이 발생합니다.

prepareForSegue 메서드에 논리를 추가하여 각 세그먼트를 구별해야합니다. 예를 들어 대상 컨트롤러에이를 첨가 한 다음 논리를 첨가함으로써 해결

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

그게 한 걸음 더 가깝습니다 - 이제 홈 화면으로 돌아가지만 TableViewController의 탐색 표시 줄은 여전히 ​​화면 상단에 표시됩니다 ... 강제로이 방법이 있습니까? 해산? –

+0

은 내비게이션 막대의 제목을 업데이트하지 않았기 때문일 것입니다. 당신은 "addNote"segue를 위해 이것을하고있다. - 두번째 segue를 위해서도 할 코드를 삽입한다. 이렇게해도 문제가 해결되지 않으면 github을 통해 코드를 공유 할 수 있습니까? –

0

: I 또한 barButtonItem에 연결된 '@IBAction의 func`를 사용하여 시도

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