2016-07-01 9 views
0

Dies ist ein Problem, für das ich scheinbar keine Lösung für Online finden kann.Nach Verwendung von "disneyViewController" in einer modalen Ansicht wird die beabsichtigte Ansicht mehrmals verschoben.

Ich habe folgendes Drehbuch:

Die Zeilen in der ersten Tabellenansicht haben einen Push segue zu der Ansicht, die Sie über den anderen Ansichten zu sehen.

Jetzt, wenn ich die bar-Taste in der anfänglichen Tabellenansicht drücke, führt es einen modalen Übergang zu einem neuen Navigationscontroller (der in der Mitte), wo Sie ein Objekt erstellen können.

in den selectFriends sehen auf der rechten Seite, wenn Sie auf drücken getan, um es diesen Code ausgeführt wird:

self.dismissViewController(true, completion: nil) 

dann bringt es mich auf die anfängliche Tabellenansicht zurück, das ist das, was ich will.

Hier ist, wo es komisch wird

, wenn ich in die modalen Navigationssteuerung von der ersten Ansicht entlassen, es funktioniert gut

jedoch, wenn ich die modal Navigationssteuerung entlassen aus der selectFriends ansehen zurück zur ursprünglichen Tabellenansicht,

Anschließend wird der goToChat-Übergang so oft ausgeführt, wie er vor dem Anzeigen der modalen Ansicht ausgeführt wurde.

Es führt nicht einmal den didSelectRowAtIndexPath-Code aus.

Meine Vermutung ist, dass es etwas mit dem Mapping oder dem Speichern von Ansichten und Segmenten in der anfänglichen Navigationssteuerung zu tun hat.

Die erste Tabellenansicht hat dies für DidSelectRowAtIndexPath:

// finds user item to pass to UserProfileView 
    print("row selected") 

    if self.resultSearchController.active { 

     self.selectedItem = self.filteredItemsList[indexPath.row] 

    } else { 

     self.selectedItem = self.itemsList[indexPath.row] 


    } 

    self.ref.child("users/\(self.currentUser!.uid)").observeEventType(.Value, withBlock: { (snapshot) -> Void in 

     self.currentUserItem = UserItem(snapshot: snapshot) 
     self.performSegueWithIdentifier("goToChat", sender: nil) 

    }) 


} 

Bitte lassen Sie mich wissen, wenn Sie eine Lösung.

Best wishes, Khaled

+0

Es sieht aus wie das Problem ist Ihre 'observeEventType' Methode. Was ist das? So etwas habe ich noch nie gesehen. – matt

+0

Es handelt sich um einen Firebase-Datenabruf, der jedes Mal ausgelöst wird, wenn die Datenbank geändert wird ... Wenn das Objekt erstellt wird, wird es also unabhängig von der Auswahl ausgeführt. DU SIND ABSOLUT RICHTIG! Danke, dass Sie mich darauf aufmerksam gemacht haben. – Aylii

+2

Richtig, so meine Vermutung ist, dass Sie den Beobachter durch den Aufruf "observeEventType" "registriert" haben, und so feuert er jetzt wieder, weil er immer noch beobachtet ... Deshalb muss der Code nicht erneut ausgeführt werden; der "Block" wurde beibehalten, er läuft jetzt von selbst. – matt

Antwort

0

Das war irgendwie peinlich. Ich tauchte tatsächlich in den UIKit-Code ein, um den presentViewController zu sehen und den Code der secueWithIdentifier-Funktion auszuführen, in der Hoffnung, meine Antwort zu finden.

Aber wie Matt in den Kommentaren darauf hingewiesen, die observeEventType Funktion DID sah fehl am Platz. Als ich genauer hinschaute, erkannte ich meinen Fehler.

Jedes Mal, wenn ich eine Tabellenzeile auswählte, registrierte es einen neuen Ereignis-Listener für Änderungen in der Datenbank. Sobald ein neues Element erstellt wurde, startet es den Code innerhalb der Sequenz (einschließlich des Abschnitts) wie oft ein Listener war Eingetragen.

ich es wie folgt festgelegt:

// This is a Firebase "user object" that carries the current user's ID 

let currentUser = FIRAuth.auth().currentUser 

// Now we set the listener in the viewDidLoad to simply update the currentUserItem 
and not perform any segue or code that we only need to run once. 

override func viewDidLoad() { 

    self.ref.child("users/\(self.currentUser.uid)").observeEventType(.Value, withBlock: { (snapshot) -> Void in 

    self.currentUserItem = UserItem(snapshot: snapshot) 

    }) 

} 

Jetzt im didSelectRowAtIndexPath: Methode nur wir in dieser Zeile die selectedItem bekommen und das Segue laufen. EINMAL.

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 

    // finds item in respective row to enter chat 
    if self.resultSearchController.active { 

     self.selectedItem = self.filteredItemsList[indexPath.row] 

    } else { 

     self.selectedItem = self.ItemsList[indexPath.row] 


    } 

    self.performSegueWithIdentifier("goToChat", sender: nil) 

} 

Nochmals, danke Matt!

Verwandte Themen