2010-12-08 6 views
0

Ich arbeite an einer Möglichkeit, einen JA/NEIN-Bildschirm zu präsentieren, den der Benutzer akzeptieren muss, bevor er zur App geht.Verhalten ändert sich, wenn ich von XCode starten

Diese Methode zum Akzeptieren oder Ablehnen wird innerhalb von ApplicationDidFinishLaunching ausgelöst und hat einen Zeitgeber, der in 2 Sekunden (oder wann immer) ausgelöst wird. Es sucht in NSUserDefaults und ruft einen Schlüssel ab, der mir sagt, ob die Vereinbarung akzeptiert wurde oder nicht. Wenn nicht (oder null), starte ich einen ModalViewController, um die Vereinbarung zu präsentieren. Die AppDidFinishLaunching Methode ist praktisch vorformulierten und sieht wie folgt aus:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {  
    // Override point for customization after application launch. 
    // Add the tab bar controller's view to the window and display. 
    [window addSubview:tabBarController.view]; 
    [window makeKeyAndVisible]; 
    [self performSelector:@selector(checkTheEULA) withObject:nil afterDelay:kDelay]; 
    return YES; 
} 

Alles funktioniert super. Das Problem ist, es funktioniert nur einmal - wenn ich von Xcode starte. Wenn ich die App stoppe und vom Simulator oder von meinem Gerät aus starte, wird dem Benutzer keine modale Ansicht angezeigt.

Kann mir jemand sagen, was passiert, um dies zu verursachen? Ich nehme an, es hat etwas mit der AppDelegate selbst zu tun? Verlasse ich etwas?

Jede Hilfe wäre sehr geschätzt - ich bin immer noch ziemlich grün :-)

Danke,

- (void)checkTheEULA{        

    // get value in kAcceptedOrNot key (NSString, either YES NO or nil), assign it to acceptedOrNot 
    self.acceptedOrNot = [[NSUserDefaults standardUserDefaults] objectForKey:kAcceptedOrNotKey]; 

    if (self.acceptedOrNot == nil || [self.acceptedOrNot isEqualToString:@"NO"]) { 

     NSLog(@"The value of kAcceptedOrNot is %@ (nil or NO). This means that the EULA has never been launched, or has launched but has been UNaccepted", self.acceptedOrNot); 
     NSLog(@"I'm launching the ModalView to give the user the chance to accept the EULA"); 

     [self showModalView]; 
    } else { 

     // else, the value of kAcceptedOrNot exists and is YES, and so no action needs to be taken 

     NSLog(@"Value of accepteOrNot is %@. (hopefully it's 'YES' :-)", acceptedOrNot); 
     } 
    } 
+0

Können Sie nach Ihren Code für 'checkTheEULA' tun kann? –

+0

Absolut. Werde es heute Abend tun. Vielen Dank! –

+0

Es gibt eine andere Methode, showModalView, die ich posten kann, aber nicht wusste, wie viel Upstream-Code hier gepostet werden muss. Lass es mich wissen, wenn ich mehr posten sollte. –

Antwort

0

Meine erste Vermutung ist, dass Sie eine Race-Bedingung, wo die Sicht nicht ist wird immer geladen und präsentiert, bevor der Timer-basierte Rückruf ausgelöst wird.

Versuchen Sie, den Aufruf von checkTheEula direkt in ViewDidAppear des View-Controllers zu setzen, so dass er ausgelöst wird, sobald Sie eine Benutzeroberfläche auf dem Bildschirm haben.

Um zurück zur AppDelegate erhalten Sie so etwas wie

-(void) viewDidAppear:(BOOL)animated 
{ 
    [super viewDidAppear:animated]; 

    DelegateClass *app = (DelegateClass*)[UIApplication sharedApplication].delegate; 
    [app checkTheEula]; 
} 
+0

Das ist keine schlechte Idee. Meine aktuelle Konfiguration verwendet einen TabBarController für den root viewController. Nachdem checkTheEULA ausgelöst wurde, bestimme ich, welcher viewController sichtbar ist, weise diesen VC als übergeordnete Ansicht der modalen Ansicht zu und delegiere ihn, und fordere ihn dann auf, das modalView zu präsentieren. In der Praxis ist es jedoch sinnvoll, diesen Schritt zu vereinfachen und den startController auf der linken Seite der tabBar zu verwenden. Wenn ich mir das nicht vorstellen kann, kann ich es einfach tun. Ich werde auch die "race condition" untersuchen, um zu sehen, ob das ein Licht darauf wirft. Vielen Dank! –

+0

Ahh Entschuldigung. Mit "Race Condition" meine ich, dass Sie ein Event haben, dass manchmal spät genug passiert, dass alles funktioniert, aber andere Zeiten passieren zu früh, bevor andere Stücke vorhanden sind. Dies ist ein häufiges Problem, das zwischen dem Ausführen in einem Simulator und auf einem Gerät zu sehen ist. Meine Vermutung ist, dass, wenn Sie über Xcode starten, eine Kombination von Timing-Faktoren Ihre Benutzeroberfläche erscheinen lässt, bevor Sie versuchen, Ihren EULA-Anruf zu tätigen, damit Sie etwas zum Malen haben. Auf dem Gerät dauert es wahrscheinlich länger, bis die Benutzeroberfläche initialisiert wird. Wenn Sie EULA aufrufen, ist die Benutzeroberfläche noch nicht fertig. – MahatmaManic

Verwandte Themen