2012-01-05 18 views
5

पर मुझे लगता है कि यह एक बहुत ही सामान्य उपयोग है क्योंकि मैंने इसे कई ऐप्स में देखा है। लेकिन कुछ दिनों के खर्च के बाद, मैं अभी भी इसके साथ संघर्ष कर रहा हूं। मेरे पास निम्न की तरह एक संरचना है:लॉगआउट एक्शन

UITabBarController 
-- UINavigationController1 
---- UITableViewController1 

-- UINavigationController2 
---- UITableViewController2 

अब मेरे पास UITableViewController2 पर एक लॉगआउट बटन है। जब मैं उस लॉगआउट बटन पर क्लिक करता हूं, तो मैं सभी और किसी भी व्यू कंट्रोलर को डिलीकेट किया जाना चाहता हूं, सभी अनलोड किए गए हैं। मूल रूप से ऐप लॉन्च करने की तरह ताजा शुरू करें। मैं मूल रूप से उन UITableViewController में से प्रत्येक पर viewDidLoad चाहता हूं जिसे फिर से बुलाया जाता है।

मैंने UITableViewController2 पर लॉगआउट कार्रवाई के दौरान मेरे एपडिलेगेट में निम्न विधि को कॉल करने का प्रयास किया।

-(void) logout { 
    for (UINavigationController* ctrl in self.tabBarController.viewControllers) { 
     [ctrl popToRootViewControllerAnimated:NO]; 
     ctrl.visibleViewController.view = nil; 
    } 

[self.tabBarController.view removeFromSuperview]; 
[self.window addSubview:self.tabBarController.view]; 

}

लेकिन अफसोस, यह काम करने के लिए प्रतीत नहीं होता?

कोई विचार कैसे ऐसी चीज को पूरा किया जाता है? इसके अलावा मैं दृश्य ViewController के साथ आईओएस 4 बनाम आईओएस 5 में विभिन्न व्यवहार देखता हूं। मैं यहां किसी भी मोडल व्यू कंट्रोलर का उपयोग नहीं कर रहा हूं। कोई गॉथस?

अद्यतन: मैं एआरसी उपयोग नहीं कर रहा

धन्यवाद MBH

+0

मुझे यकीन नहीं है कि यह आपके मामले के लिए बिल्कुल काम करेगा, लेकिन मैं सिर्फ लॉगआउट पर 'popToRootViewController' करना चाहता था, जिस स्थिति में मुझे वास्तव में पसंद है [एडम केम्प का विचार] (http://forums.xamarin.com/discussion/3749/popviewcontroller-all-the-way-to-main-screen-of-app-rootviewcontroller), जो आपको सुझाव देता है कि आप 'UserDidLogOut' के लिए 'NSNotificationCenter' ईवेंट जोड़ें और उस ईवेंट को ** ** अपने व्यू कंट्रोलर के अंतर्गत संभाल लें। – cloudrave

उत्तर

1

आप अपने दृश्य नियंत्रकों को रिहा करने की जरूरत है। जब उनकी रिलीज विधि को बुलाया जाता है, तो उस विधि में अपने सभी ऑब्जेक्ट के संसाधनों को रिलीज़ करने के लिए बयानों को शामिल करना चाहिए (और इसके सुपरक्लास को भी हटा देना)।

+0

मैं इसे कैसे प्राप्त करूं? [ctrl.visibleViewController रिलीज]? काम नहीं करता। [ctrl रिलीज]? कोशिश की कि साथ ही। – mbh

+0

क्या आप एआरसी का उपयोग कर रहे हैं? अगर आप हैं तो जवाब अलग हो सकता है। – Jim

+0

इसे इंगित करने के लिए धन्यवाद। उल्लेख किया जाना चाहिए था। सवाल यह है कि मैं एआरसी – mbh

1

दोनों नेविगेशन नियंत्रकों के लिए आपका रूट व्यू कंट्रोलर उनके संबंधित टेबल व्यू नियंत्रक हैं। तो मुझे नहीं लगता कि popToRootViewController कुछ भी करेगा।

आपको शायद डेटा को रीसेट करने और विचारों को हटाने के बजाय विचारों को रीफ्रेश करने की आवश्यकता है।

+0

मेरे पास एकाधिक तालिका दृश्य नियंत्रक हैं। इसलिए मैंने UINavigationController का उपयोग किया। तो पॉप ने रूट/टॉप वन को छोड़कर अन्य सभी व्यू कंट्रोलर को डेलोक करने में मदद की। जहां मुझे – mbh

+0

को हटाने में सक्षम नहीं होने का मुद्दा है, तो आप रूट व्यू कंट्रोलर को छोड़कर प्रत्येक व्यू कंट्रोलर को हटा सकते हैं, क्योंकि आप अपने सभी अन्य नियंत्रकों को पुनः लोड करने के लिए कम से कम एक व्यू कंट्रोलर रखना चाहते हैं। –

2

आपका फॉर-लूप रिलीज़ होगा और इस प्रकार किसी भी व्यू कंट्रोलर को हटा देगा जिसे आपने संबंधित यूनाविगेशन कंट्रोलर जड़ों पर धक्का दिया है (आपके पास कितने टैब हैं), यानी जब आप रूट पर वापस आते हैं तो इन्हें पर्यवेक्षण नहीं किया जाएगा प्रत्येक नेविगेशन नियंत्रक के, ये स्वचालित रूप से dealloc-ed हैं। ये आपके UITableViewControllers का ख्याल रखा गया है।

संबंधित UINavigationControllers के लिए, आपको पुराने उदाहरण को रिलीज़ करने के लिए अपने टैबबार-नियंत्रक की आवश्यकता होगी। आईएमएचओ, यह आपके लिए किया जाना चाहिए जब आप UITabBarController को छोड़ दें।

यह तब UITabBarController को छोड़ देता है। मुझे नहीं लगता कि यह टीबीएच किया जा सकता है। आपका कोड केवल दृश्य को हटा देगा, लेकिन टैबबार नियंत्रक को ही नहीं हटाएगा। और जैसा कि कृष्णा के बताते हैं, आपको अन्य सभी को पुनः लोड करने के लिए कम से कम एक दृश्य नियंत्रक की आवश्यकता है। कोड को एपडिलेगेट में डालकर समझ में आता है, लेकिन आपको यह सुनिश्चित करने की आवश्यकता है कि आपका लॉगआउट() UITableViewController2 के साथ-साथ UITabbarController पर बनाए रखेगा क्योंकि इसे कहीं UITableViewController2 से बुलाया गया है।

एक्सप्लोर करने का एक विचार, क्या आपके ऐपडिलेगेट को टैबबार-कंट्रोलर को एक उदाहरण है जिसे आप रिलीज़ कर सकते हैं और स्वयं को विन्डो से दृश्य हटाने के बाद एक नया उदाहरण बना सकते हैं?

// manually create UITabBarController - AppDelegate holds instance 
    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {  
    mytabcontroller=[[UITabBarController alloc] initWithNibName:@"foo" bundle:nil]; 
} 

- (void) logout { 
    [self.tabBarController.view removeFromSuperview]; 
    [mytabcontroller release]; 
    mytabcontroller=[[UITabBarController alloc] initWithNibName:@"foo" bundle:nil]; 
    [self.window addSubview:self.tabBarController.view]; 
} 

लेकिन जैसा कि मैंने कहा, इस बिंदु पर स्मृति प्रबंधन के साथ चेतावनी हो सकती है।

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