2013-06-12 5 views
7

Wie erreiche ich dieses Zeug unten? Bitte geben Sie mir eine Anleitung dafür. Ich beschreibe unten mein Problem.iOS: Ist es möglich, vorherige ViewController nach dem Absturz und Neustart App zu öffnen?

Wenn ich auf Home-Taste tippen und App aus dem Fach entfernen und während ich App öffne bekomme ich den Login-Bildschirm. Ich weiß, wie man NSUserDefaults gut verwendet.

Aber mein Problem ist, dass, wenn ich 3. oder 4. navigieren viewController und ich Home-Taste drücken und App aus dem Fach entfernen, dann, wann immer ich App öffnen, als ich mit zuletzt geöffnet öffnen möchte viewController.

Auch gleich, wenn meine App Crashing ist und ich es wieder öffne, dann möchte ich App mit zuletzt geöffnet öffnen viewController Zustand.

Also möchte ich nur wissen, dass das möglich ist oder nicht? Wenn ja, dann bitte führe mich, wie ich dieses Zeug erreichen kann.

Danke

Antwort

2

Ich verstehe Sie mit dem Code Teil ok sind, so werde ich nur mein Vorschlag ein nsuserdefault Wert der obersten Objekt auf Navigationsarray gesetzt

auf viewDidLoad jeder View-Controller geben.

, wenn ihr nicht zu viele Zweige, dann können Sie die Push an der Wurzel-View-Controller verwalten leicht

+0

dank für die Antwort Ihre Idee ist gut, aber ich besorgt ein bout, wie man all meine App mit navigaiton + tabar verwalten und auch zwei Arten von Login-Admin und verwenden ..? so, wie dies zu verwalten plus LoginScreen ... und die zugehörige Sitzung und Benutzer ..? –

+0

Whooh ich denke, Sie müssen eine Klasse (serialisiert) machen und dann speichern Sie alle notwendigen Informationen wie Account-Typ, Registerkarte Index, Viewcontroller. Speichern Sie es in Benutzer-Standard als Nsdata – amar

3

Ja, beide Fälle möglich sind.

Bei Absturz können Sie mit UncaughtExceptionHandler Code ausführen. In Sie AppDelegate, registrieren Sie Handler, den Sie wie folgt aus:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 

NSSetUncaughtExceptionHandler(&uncaughtExceptionHandler); 
// Other didFinishLaunchingWithOptions code 

Und Ihre Handler-Methode auf die gleiche .m-Datei

void uncaughtExceptionHandler(NSException *exception) 
{ 
    // App crashed, save last selected tabbar index to the to the NSUserDefaults 
    [[NSUserDefaults standardUserDefaults] setInteger:tabBarController.selectedIndex forKey:@"LastSelectedTabbarIndex"]; 
    [[NSUserDefaults standardUserDefaults] synchronize]; 
} 

Während App läuft, fügen Sie den Überblick über zuletzt gewählte Tab-Leiste zu halten Controller, verwenden Sie UITabBarControllerDelegate und speichern Sie den neu ausgewählten Tabbar-Index auf NSUserDefaults. Kurzes Beispiel:

- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController 
{ 
    NSUInteger tabIndex = [[tabBarController viewControllers] indexOfObject:viewController]; 

    // I have newly selected index, now save it to the NSUserDefaults 
} 

Dieser Code wird letzte Tabbar Index zum NSUserDefaults jedes Mal Tabbar des ausgewählten Indexänderungen ausgewählt speichern.

Wenn Sie schließlich startet App (in Ihrem didFinishLaunchingWithOptions), lesen Sie zuletzt gespeichert Tabbar Index von NSUserDefaults und setzen Tabbar des ausgewählten Index entsprechend

self.tabBarController.selectedIndex = lastSelectedIndexFromDefaults; 

Edit: Wenn Sie auch UINavigationController s Controller wiederherstellen müssen Stack, seine ziemlich schwierige Aufgabe. Ich gebe dir nur einen kurzen Überblick, was mir in den Sinn kommt.

Es gibt zwei Fälle:

  • Sie haben benutzerdefinierte Ansicht Controller initializers und müssen benutzerdefinierte diesen Controller-Objekt übergeben - in diesem Fall seine fast unmöglich (in einer vernünftigen Zeit) implementieren diese
  • Sie verwenden nur -init oder -initWithNibName...: um View-Controller im Navigations-Stack zu initialisieren. Sie können Controller vom Stamm UINavigationController der Registerkarte auflisten, ihre Klassennamen mit NSStringFromClass abrufen und sie unter NSUserDefaults speichern. Beim Start von Apps würden Sie die Prozedur umkehren (Controller initialisieren, indem Sie ihre Namen verwenden, die aus NSUserDefaults gelesen werden, indem Sie etwa Folgendes verwenden: UIViewController *vc = [[NSClassFromString(@"aa") alloc] init];).
+0

aber was ist, während ich in Tabbarviewcontroller navigieren -> anotherViewcontroller ..? –

+0

thx für info aber und deine idee ist gut, aber ich machte mir Sorgen darüber, wie man all meine app mit navigaiton + tabar und auch zwei art von login admin verwalten und verwenden ..? so, wie dies zu verwalten plus LoginScreen ... und die zugehörige Sitzung und Benutzer ..? –

+0

Sorry, aber ich kann Ihnen nicht mehr oder mehr im Detail helfen: -/Mögliche Lösung hängt stark von Ihrer apps Architektur, ich hoffe Sie verstehen, dass :-) –

2

Dies ist nicht die richtige Antwort, aber Sie können es nach dem Start für die Navigation verwenden.

In AppDelegate Datei Verwendung unter Codes: ---

#import "NewSAppDelegate.h" 
#import "NewSViewController.h" 

static NewSAppDelegate *globalSelf; 

@implementation NewSAppDelegate 

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 
    // Override point for customization after application launch. 
    self.viewController = [[NewSViewController alloc] initWithNibName:@"NewSViewController" bundle:nil]; 
    self.navController=[[UINavigationController alloc] initWithRootViewController:self.viewController]; 
    self.window.rootViewController = self.navController; 
    [self.window makeKeyAndVisible]; 
    globalSelf=self; 
    NSSetUncaughtExceptionHandler(&uncaughtExceptionHandler); 

    return YES; 
} 

void uncaughtExceptionHandler(NSException *exception) 
{ 
    UIViewController *currentVC = globalSelf.navController.visibleViewController; 
    [[NSUserDefaults standardUserDefaults] setObject:NSStringFromClass(currentVC.class) forKey:@"lastVC"]; 
} 

- (void)applicationDidEnterBackground:(UIApplication *)application 
{ 
    UIViewController *currentVC = self.navController.visibleViewController; 
    [[NSUserDefaults standardUserDefaults] setObject:NSStringFromClass(currentVC.class) forKey:@"lastVC"]; 
} 

- (void)applicationDidBecomeActive:(UIApplication *)application 
{ 
    [[NSNotificationCenter defaultCenter] postNotificationName:@"appDidBecomeActive" object:nil]; 
    // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. 
} 

In Ihrem Login Viewcontroller des init-Methode einen Beobachter zur Meldung hinzufügen und in Benachrichtigungsmethode, können Sie anwenden, wenn die Bedingungen für Viewcontroller Namen received.and Push-to dass Viewcontroller auf Loginview-Controller als Start: ---

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
{ 
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
    if (self) { 

     [[NSNotificationCenter defaultCenter] addObserver:self 
               selector:@selector(openLastVC) 
                name:@"appDidBecomeActive" 
                object:nil]; 

     // Custom initialization 
    } 
    return self; 
} 

-(void)openLastVC 
{ 
    NSLog(@"val ==%@",[[NSUserDefaults standardUserDefaults] valueForKey:@"lastVC"]); 

    if ([[[NSUserDefaults standardUserDefaults] valueForKey:@"lastVC"] isEqualToString:@"GhachakViewController"]) { 
     GhachakViewController *gvc=[[GhachakViewController alloc] initWithNibName:@"GhachakViewController" bundle:nil]; 
     [self.navigationController pushViewController:gvc animated:NO]; 
    } 
} 

Kann diese Ihnen helfen, ....

Verwandte Themen