2013-06-12 11 views
7

नीचे इस सामग्री को कैसे प्राप्त करें? कृपया मुझे इसके लिए कुछ मार्गदर्शन दें। मैं नीचे अपनी समस्या का वर्णन करता हूं।आईओएस: क्या ऐप क्रैश करने और फिर से लॉन्च करने के बाद पिछले दृश्य नियंत्रक को खोलना संभव है?

जब मैं घर बटन टैप करता हूं और ट्रे से ऐप हटा देता हूं और जब मैं ऐप खोल रहा हूं तो मुझे लॉगिन स्क्रीन मिलती है। मुझे पता है कि NSUserDefaults अच्छी तरह से कैसे उपयोग करें।

लेकिन मेरी समस्या यह है कि जब मैं 3 या 4 viewController नेविगेट और मैं होम बटन दबाएँ और ट्रे से एप्लिकेशन को हटाने, तो जब भी मैं एप्लिकेशन को खोलने से मैं पिछले खुला viewController साथ खोलना चाहते है।

भी जब मेरा ऐप क्रैश हो रहा है और मैं इसे फिर से खोल रहा हूं तो मैं अंतिम खुले viewController स्थिति के साथ ऐप खोलना चाहता हूं।

तो मैं सिर्फ यह जानना चाहता हूं कि यह संभव है या नहीं? यदि हां, तो कृपया मुझे यह बताएं कि इस सामान को कैसे प्राप्त किया जाए।

आप

उत्तर

2

धन्यवाद मैं समझता हूँ कि आप कोड भाग के साथ ठीक कर रहे हैं तो मैं बस अपना सुझाव नेविगेशन सरणी पर शीर्ष सबसे वस्तु का एक nsuserdefault मान सेट हर दृश्य नियंत्रक के viewDidLoad पर

दे देंगे।

अगर उनके भी कई शाखाओं नहीं हैं तो आप रूट दृश्य नियंत्रक पर धक्का प्रबंधन कर सकते हैं आसानी से

+0

धन्यवाद अपने विचार उत्तर के लिए अच्छा है, लेकिन मैं चिंतित मई एक इस सब ऐप को नेविगैटन + टैबबार और दो प्रकार के लॉगिन एडमिन के साथ कैसे प्रबंधित करें और इसका उपयोग करें ..? तो इस प्लस लॉग इनस्क्रीन ... और इसके संबंधित सत्र और उपयोगकर्ताओं को कैसे प्रबंधित करें ..? –

+0

वाह मुझे लगता है कि आपको कक्षा (धारावाहिक) बनाना होगा और फिर इसमें सभी आवश्यक जानकारी जैसे खाता प्रकार, टैब इंडेक्स, व्यू कंट्रोलर को सहेजना होगा। इसे nsdata – amar

3

हाँ, दोनों ही मामलों संभव हो रहे हैं।

क्रैश पर, आप कुछ कोड करने के लिए UncaughtExceptionHandler का उपयोग कर सकते हैं। आप अनुप्रयोग प्रतिनिधि में, रजिस्टर आप इस तरह हैंडलर:

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

NSSetUncaughtExceptionHandler(&uncaughtExceptionHandler); 
// Other didFinishLaunchingWithOptions code 

और एक ही मीटर फ़ाइल

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]; 
} 

करने के लिए अपने हैंडलर विधि जोड़ने जबकि एप्लिकेशन चलाता है, अंतिम चयनित टैब बार का ट्रैक रखने के नियंत्रक, UITabBarControllerDelegate का उपयोग करें और नए चयनित टैबबार की अनुक्रमणिका को NSUserDefaults पर सहेजें। लघु उदाहरण:

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

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

इस कोड को पिछले NSUserDefaults हर बार tabbar के लिए चुनी गई सूचकांक परिवर्तन करने के लिए tabbar के सूचकांक चयनित बचत होगी।

अंत में, जब आप शुरू होता एप्लिकेशन (अपने didFinishLaunchingWithOptions में), पिछले पढ़ा NSUserDefaults से tabbar सूचकांक को बचाया और सेट tabbar के लिए चुनी गई सूचकांक तदनुसार

self.tabBarController.selectedIndex = lastSelectedIndexFromDefaults; 

संपादित करें: आप भी UINavigationController रों नियंत्रकों को बहाल करने की जरूरत है ढेर, यह बहुत मुश्किल काम है। मैं आपको बस एक त्वरित अवलोकन देता हूं जो मेरे दिमाग में आता है।

2 मामलों के होते हैं:

  • आप कस्टम दृश्य नियंत्रकों initializers है और कस्टम पारित करने के लिए उन लोगों के नियंत्रकों पर आपत्ति की जरूरत है - इस मामले में, अपने लगभग असंभव (कुछ उचित समय में) इस
  • लागू
  • नेविगेशन स्टैक में दृश्य नियंत्रकों को प्रारंभ करने के लिए आप केवल -init या -initWithNibName... का उपयोग करते हैं। आप टैब के रूट UINavigationController से नियंत्रकों की गणना कर सकते हैं, NSStringFromClass का उपयोग करके अपने कक्षा के नाम प्राप्त कर सकते हैं और उन्हें NSUserDefaults पर सहेज सकते हैं। ऐप्स शुरू होने पर, आप प्रक्रिया को उलट देंगे (NSUserDefaults से कुछ नामों का उपयोग करके उनके नाम तारों का उपयोग कर नियंत्रकों को प्रारंभ करें: UIViewController *vc = [[NSClassFromString(@"aa") alloc] init];)।
+0

के रूप में उपयोगकर्ता डिफ़ॉल्ट में सहेजें, लेकिन जब मैं Tabbarviewcontroller -> anotherVIewcontroller .. नेविगेट करता हूं, तो क्या होगा? जानकारी के लिए –

+0

thx लेकिन आपका विचार अच्छा है, लेकिन मुझे इस बारे में चिंतित है कि यह मेरे ऐप को नेविगैटन + टैबबार और दो प्रकार के लॉगिन व्यवस्थापक और उपयोग के साथ कैसे प्रबंधित करें ..? तो इस प्लस लॉग इनस्क्रीन ... और इसके संबंधित सत्र और उपयोगकर्ताओं को कैसे प्रबंधित करें ..? –

+0

क्षमा करें, लेकिन मैं आपको और अधिक विस्तार से मदद करने में असमर्थ हूं: -/संभावित समाधान दृढ़ता से आपके ऐप्स आर्किटेक्चर पर निर्भर करता है, मुझे उम्मीद है कि आप समझते हैं :-) –

2

यह उचित उत्तर नहीं है लेकिन आप इसे लॉन्च करने के बाद नेविगेटिंग व्यू के लिए उपयोग कर सकते हैं।

AppDelegate फ़ाइल उपयोग में कोड नीचे: ---

#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. 
} 

अपना लॉगिन ViewController के init विधि में सूचना देने के लिए और सूचना विधि में एक पर्यवेक्षक जोड़ने के लिए, आप आवेदन कर सकते हैं, तो करने के लिए ViewController का नाम received.and धक्का के लिए शर्तें कि ViewController के रूप में LoginView नियंत्रक शुरू करने पर: ---

- (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]; 
    } 
} 

इस मदद आप ....

संबंधित मुद्दे

 संबंधित मुद्दे