Frage

Vor iOS4, meine app anfängliche View-Controller ein Passwort Ein / Aus-Einstellungen Variable in viewWillAppear würde überprüfen und wenn Satz auf, präsentieren eine modale Passwort-Bildschirm, dort bleiben würde, bis das richtige Passwort eingegeben wurde oder die Home-Taste gedrückt wurde.

Mit iOS4, wenn mein app im Hintergrund gewesen ist, würde ich den Benutzer mag ich wohl fühlen, dass die Daten, die innerhalb der App nicht leicht zugänglich ist, wenn sie ihr Telefon mit jemandem Gebrauch zur Hand waren.

Da die App auf jeden Bildschirm (der Bildschirm, dass der App zuletzt am war) zurückkehren können, dachte ich, ich die UIApplicationWillEnterForegroundNotification ganzen Ort mit lokalen Selektoren verwenden würde (doppelte enterPasscode Methoden), das jeweils mit den korrekten View-Controller Push basierend auf dem lokalen Bildschirm, aber es muss ein besserer Weg sein.

kann ich hier eine leichte konzeptionelle Missverständnisse werden muss. Kann jemand einen anderen Ansatz vorschlagen oder mich schubsen zusammen mit dem nächsten Schritt. Kann ich diese Methode als gemeinsam genutzter, aber immer noch die korrekten lokalen View-Controller zu drücken wissen?

Danke

EDIT / UPDATE:

Kurzversion: Es funktioniert, aber kann es vielleicht noch ein besserer Weg (jede Hilfe dankbar) ...

sein

Ich habe eine Standard-Singleton mit einem View-Controller.

PasscodeView.h enthalten:

UIViewController *viewController;
@property (nonatomic, retain) UIViewController *viewController;

PasscodeView.m enthalten:

@synthesize viewController;

Ich habe dies in der AppDelegate:

-(void)applicationWillEnterForeground:(UIApplication*)application {

    PasscodeView *passcodeView = [PasscodeView sharedDataManager];
    UIViewController *currentController =  [passcodeView viewController];
    NSLog(@"%@", currentController);  //testing
    EnterPasscode *passcodeInput = [[EnterPasscode alloc] initWithNibName:@"Passcode" bundle:nil];
    [currentController presentModalViewController:passcodeInput animated:NO];
    [passcodeInput release];
}

und im Anschluss an die in allen meinen viewDidLoad, den aktuellen View-Controller zu aktualisieren, wie ich in jedem Bildschirm ging (nur 2 Zeilen scheint aber nach wie vor, dass es einen besseren Weg):

PasscodeView *passcodeView = [PasscodeView sharedSingleton];
passcodeView.viewController = [[self navigationController] visibleViewController];

Ich wünschte, es eine Möglichkeit gäbe haben die aktuellen View-Controller von applicationWillEnterForeground bekommen, aber ich kann ihn nicht finden - jede Hilfe hier noch geschätzt.

Für Konsistenz, änderte es eine Linie und hatte eine Linie eine Navigationsleiste zu bekommen, den Rest der App anzupassen und einen Titel aufzunehmen.

UINavigationController *passcodeNavigationController = [[UINavigationController alloc] initWithRootViewController:passcodeInput];
[currentController presentModalViewController: passcodeNavigationController animated:NO];
War es hilfreich?

Lösung

Sie können dieses Verhalten in AppDelegate zentralisieren durch die Implementierung

-(void)applicationWillEnterForeground:(UIApplication*)application;

Sie können einen Singleton, dass speichert die zur Zeit entsprechenden modal View-Controller implementieren, es in viewWillAppear in jedem Ihrer Ansicht-Controller zu aktualisieren.

Bearbeiten : Ich war die Annahme, dass Sie bereits eine Reihe von View-Controller hatten, dass man zeigen wollte. Ich bezweifle, dass Sie es wirklich brauchen. Wenn Sie ein genannt haben, sagen PasscodeInputController, dann applicationWillEnterForeground etwas aussehen würde:

-(void)applicationWillEnterForeground:(UIApplication*)application {
    UIViewController *currentController =  [window rootViewController];
    PasscodeInputController *passcodeInput = [[PasscodeInputController alloc] init];

    [currentController presentModalViewController:passcodeInput animated:NO];
    [passcodeInput release];
}

Ich hoffe, dass Adressen Ihre Frage mehr direkt.

Andere Tipps

Verhalten Ihrer Anwendung, wenn der Vordergrund reentering so ähnlich sein sollte wie möglich, wenn es startet zum ersten Mal. Vor diesem Hintergrund könnten Sie Ihre applicationDidFinishLaunching: mit applicationWillEnterForeground: kombinieren, aber einige Ansichten unter Berücksichtigung bereits geladen werden könnten. Der Code ist so etwas wie folgt aus:

id myState = (isReentering) ? [self validateState] : [self loadStateFromSave];
NSArray * keyForObjectToLoad = [self objectsToLoadForState:myState];
for(NSString * key in keyForObjectToLoad)
    if(![self objectForKey:key]) [self loadObjectForKey:key];

Je nach Detail Ihrer App könnte es anfängliche Arbeit erfordern, aber es hat einige Vorteile:

  • Es wird dafür gesorgt starten und Neubelebung ähnlich sind, damit die User Experience ist nicht „zufällig“.
  • Sie können einfacher viele unerwünschte Speicher freigeben, wenn im Hintergrund.
  • Es ist einfacher, die Anwendung des Staat von einem zentralen Ort zu verwalten.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top