2016-06-21 10 views
1

Ich habe einen View-Controller, der in einem Navigationscontroller eingebettet ist.Absturz beim Einstellen von Navigationselementen auf UINavigationBar

In der Navigationsleiste habe ich ein segmentiertes Steuerelement in der Mitte der Leiste und dann eine Bearbeitungsschaltfläche auf der rechten Seite.

func editAction() { 

    if homeworkTasksVC?.editing == false { 

     // Set to editing 
     homeworkTasksVC?.setEditing(true, animated: true) 

     // Switch to "Done" button and 'Homework' title without segmented control 
     let navBar = self.navigationController?.navigationBar 
     let navItem = UINavigationItem(title: "Homework") 

     let doneButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.Done, target: self, action: #selector(TasksParentViewController.editAction)) 
     navItem.rightBarButtonItem = doneButton 

     navBar!.setItems([navItem], animated: true) 


    } else { 

     // Stop editing 
     homeworkTasksVC?.setEditing(false, animated: true) 

     // Switch back to "Edit" button and segmented control 
     let navBar = self.navigationController?.navigationBar 
     let navItem = UINavigationItem(title: "Homework") 
     navItem.titleView = segmentControl 

     let editButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.Edit, target: self, action: #selector(TasksParentViewController.editAction)) 
     navItem.rightBarButtonItem = editButton 

     navBar!.setItems([navItem], animated: true) 

    } 

} 

(Hinweis: die homeworkTasksVC in Frage, weil die Sicht zwischen zwei Ansichten ein UIPageViewController als Schalter ist referenziert)

Wenn ich auf die Schaltfläche Bearbeiten tippen, wird der folgende Code gefeuert

PROBLEM : Wenn ich auf "Bearbeiten" tippe, schaltet das segmentierte Steuerelement für den Texttitel ohne Probleme um und schaltet dann wieder ganz auf "Bearbeiten" zurück ABER wenn ich auf eine Zelle in der Ansicht tippe, die zu einer anderen Ansicht navigiert, und Tippen Sie dann auf "Zurück", um zu dieser ursprünglichen Ansicht zurückzukehren, und tippen Sie dann auf Bearbeiten, d t stürzt mit der folgenden Ausgabe:

2016-06-22 00: 38: 59,272 2.0 [1504: 386.949] * Beenden app aufgrund nicht abgefangene Ausnahme 'NSInternalInconsistencyException' Grund: ‚Kann nicht setItems nennen: animated: direkt auf einer UINavigationBar, die von einem Controller verwaltet wird. " * ersten Wurf Call-Stack: (0x23c85b0b 0x23442dff 0x23c85a51 0x283a0ced 0x118318 0x1189c8 0x2829b6a1 0x2841e0b9 0x2829b6a1 0x2829b631 0x2828356b 0x28283697 0x2829af51 0x2829abbf 0x28293547 0x28263dd5 0x28262379 0x23c479e7 0x23c475d7 0x23c4593f 0x23b941c9 0x23b93fbd 0x251b0af9 0x282cc435 0xe8cb4 0x23840873) libC++ abi.dylib: endet mit abgefangene Ausnahme von Typ NSException (LLDB)

Antwort

3

Was Sie wollen, ist die navigationItem Eigenschaft auf den aktuellen view-Controller einzustellen. Wenn Sie einen zweiten View-Controller auf den Navigations-Stack schieben, übernimmt UINavigationController die Verwaltung der Navigationsleisten-Objekte. Es könnte tatsächlich ein Bug sein, der vor dem Push funktioniert.

Statt:

navBar!.setItems([navItem], animated: true)

tun entweder:

homeworkTasksVC.navigationItem = navItem

oder:

self.navigationItem = navItem

Welches hängt zu holen wie Sie Ihre View-Controller stapeln.

+0

Können Sie das bitte im Code erklären? :) Ich habe das Gefühl, dass ich das schon mache ...? – Max

+0

Ich habe meine Antwort aktualisiert. – robinkunde

Verwandte Themen