Wie kann ich die Registerkarte in einer iPhone-Anwendung "zurücksetzen"?

8

Ich habe eine iPhone-Anwendung: Wenn Sie die App öffnen, sehen Sie die "LoginView". Wenn Sie sich in der Anwendung anmelden, sehen Sie einen TabBarController. Auf der dritten und letzten Registerkarte befindet sich die Schaltfläche "Abmelden". Wenn Sie klicken, sehen Sie wieder "LoginView". Mein Problem ist, dass wenn Sie sich wieder anmelden, Sie die "alte" Tableiste sehen und die ausgewählte Registerkarte ist die dritte und nicht die, und es gibt eine Schaltfläche "Abmelden". Wenn sich ein Benutzer bei einem anderen Benutzer anmeldet, sehen Sie auch die alten Daten des vorherigen Benutzers (sehr gefährlich).

Hier ist der Code: - Delegate.h:

%Vor%

- Delegate.m (didFinishLaunchingWithOptions):

%Vor%

Delegate.m (Methoden):

%Vor%

Und hier sind die zwei Methoden in zwei verschiedenen Viewcontrollern:

%Vor%

(die Abmelde-Methode ist die gleiche)

Jungs, wie kann ich dieses schmerzhafte Problem lösen? Also, hier ist eine Liste von Anwendungen, die tun, was ich will: "Foursquare", "Brightkite" und andere. Jeder hat einen Anmeldebildschirm, eine tabellarische Ansicht und eine Schaltfläche zum Abmelden.

Danke @ jeder.

    
Joaquin McCoy 03.12.2010, 05:28
quelle

4 Antworten

9

Für Login-Logout-Login-Situationen, in denen sich alle möglichen Dinge bei der Abmeldung oder beim nächsten Login zurücksetzen müssen, erstelle ich gerne eine Benachrichtigung, etwa "NewUserReset". Alles, was erforderlich ist, um sich selbst in einen ursprünglichen Zustand zurückzusetzen, wartet auf die Benachrichtigung und führt eine Methode aus, die alle erforderlichen Rücksetzungen durchführt. Die Tableiste würde den Tastentitel zum Abmelden ändern, temporäre Datenstrukturen nil / zero / release selbst, etc.

Es ist eine gute Abkopplung der Abmeldung von all den Dingen, die getan werden müssen, so dass Sie nicht versuchen, View-Controller und Datenspeicher zu manipulieren und Erscheinungsbilder von dem Controller anzuzeigen, der den Abhör-Abgriff erhalten hat.

Das Senden einer Benachrichtigung ist einfach. Wenn der Benutzer auf die Schaltfläche Abmelden klickt, senden Sie eine Benachrichtigung wie folgt:

%Vor%

Sie müssen es nicht JMUserLogout nennen, Sie brauchen nur eine Zeichenfolge, die Sie erkennen, und etwas - ich habe Ihre Initialen verwendet -, um sicherzustellen, dass Sie nicht versehentlich eine Benachrichtigung mit dem gleichen Namen senden Eine Benachrichtigung, die Ihnen nicht bewusst ist, hört zu.

Wenn diese Benachrichtigung erlischt, führt jedes Objekt, das sich beim defaultCenter registriert hat, um auf @ "JMUserLogout" zu warten, alle von Ihnen gewählten Aktionen aus. Hier ist, wie Ihr Objekt registriert (das sollte an einem Ort wie ViewWillLoad oder die Initialisierungsmethode des Objekts sein):

%Vor%

Der Selektor dort, resetForNewUser:, ist nur der Name einer Methode, die ausgeführt werden soll, wenn die Benachrichtigung erlischt. Diese Methode sieht folgendermaßen aus:

%Vor%

Wo es heißt // TUN SIE ETWAS HIER, fügst du den spezifischen Code deiner App hinzu. Beispielsweise können Sie die Registerkartenleiste als Beobachter der JMUserLogout-Benachrichtigung hinzufügen. In der resetForNewUser: Methode würden Sie den Namen der Logout-Schaltfläche in Login ändern.

In einem ViewController oder einer View oder einem Datenspeicher, der alte Daten des vorherigen Benutzers enthält, löscht die resetForNewUser-Methode alle diese Daten und setzt die Dinge so zurück, wie sie für einen neuen Benutzer sein sollten. Wenn der vorherige Benutzer beispielsweise Daten in ein UITextField eingegeben hat, würden Sie den Text löschen, yourTextFieldName.text = @ "";

Schließlich ist es wichtig, dass Sie auch Ihr Objekt als Beobachter entfernen, bevor es freigegeben wird. In Ihrer Dealloc-Methode jedes Objekts, das für den Empfang der Benachrichtigung registriert wurde, fügen Sie Folgendes hinzu:

%Vor%

Hoffentlich macht das Sinn. Die Apple-Dokumentation für NSNotificationCenter erklärt mehr und sie bieten mehrere Beispiel-Apps, die Benachrichtigungen verwenden.

    
Matthew Frederick 03.12.2010, 05:41
quelle
0

Scheint so, als ob tabBarController nicht freigegeben wird. [retain count sollte vor dem Loslassen 1 sein] tabBarController könnte irgendwo behalten werden. Überprüfen Sie die Anzahl der Retains.

    
Sagar... 03.12.2010 05:35
quelle
0

Wenn Sie die alten Daten des vorherigen Benutzers nach dem Abmelden zurücksetzen möchten, müssen Sie nur die Eigenschaft viewControllers des UITabBarControllers zurücksetzen.

Wenn Sie also UITabBarController ableiten, sollte der folgende Code Ihre App in den ursprünglichen Zustand zurückversetzen.

%Vor%

Aus der Dokumentation:

  

Wenn Sie den Wert dieser Eigenschaft zur Laufzeit ändern, entfernt der Registerkarten-Controller alle alten View-Controller, bevor er die neuen installiert. Die Tab-Leiste-Elemente für die neuen Ansichts-Controller werden sofort angezeigt und sind nicht in Position animiert.

    
jstn 24.10.2015 00:32
quelle
0

Das tabBarController-Objekt wurde möglicherweise irgendwo beibehalten. Versuchen Sie, das zu entfernen.

Und verwenden Sie den folgenden Code für Login, Logout-Methoden

%Vor%

Damit wird Ihr Problem gelöst.

    
Satya 03.12.2010 06:42
quelle

Tags und Links