2012-04-27 5 views
15

मुझे लगता है मैं एक चाल यहाँ याद आ रही है महसूस हो रहा है ...सक्रिय दृश्य नियंत्रक को कैसे बताना है जब applicationDidBecomeActive कहा जाता है?

मैं सिर्फ मौजूदा सक्रिय दृश्य नियंत्रक पर viewDidLoad या viewDidAppear कॉल करने के लिए जब applicationDidBecomeActive कहा जाता हो जाता है चाहता हूँ, इसलिए मैं, कुछ एनिमेशन या जो कुछ भी रीसेट कर सकते हैं जब अनुप्रयोग शुरू कर दिया है पृष्ठभूमि से फिर से ऊपर। मेरे कुछ विचारों परवाह नहीं है, लेकिन दूसरों को वास्तव में जानने की जरूरत है।

मैं स्टोरीबोर्ड का उपयोग कर रहा हूं और मेरी ऐप प्रतिनिधि फ़ाइल में मानक कार्य हैं - लेकिन सभी ईएमपीटीई निकायों के साथ। उदाहरण के लिए, didFinishLaunchingWithOptions बस हाँ देता है और कुछ भी नहीं करता है। स्टोरीबोर्ड स्वचालित रूप से मुझे लगता है सब कुछ करता है।

तो मैं अपने खाली, सूचना मुक्त, ऐप प्रतिनिधि से वर्तमान दृश्य नियंत्रक से कैसे बात कर सकता हूं?

+0

वहाँ बहुत अच्छी तरह से यह करने के लिए एक सरल तरीका हो सकता है लेकिन मुझे लगता है कि यदि आपको अपने ऐप प्रतिनिधि @property (मजबूत, nonatomic) UIViewController * currentViewController पर कोई प्रॉपर्टी जोड़ते हैं कि यह काम करेगा। और फिर प्रत्येक बार जब आप कोई दृश्य लोड करते हैं, तो उस संपत्ति को सेट करने के लिए प्रतिनिधि को वापस कॉल करें।और उसके बाद एप्लिकेशन WillResignActive में, इसे NSUserDefaults पर सहेजें और जब ऐप फिर से सक्रिय हो जाए तो मान की जांच करें? – geraldWilliam

उत्तर

20

मैं अधिसूचनाओं का उपयोग करने की सिफारिश करता हूं।

अपने अनुप्रयोग प्रतिनिधि के applicationdidBecomeActive इस कोड में डाल विधि में:

[[NSNotificationCenter defaultCenter] postNotificationName:@"appDidBecomeActive" object:nil]; 

अपने वर्तमान सक्रिय दृश्य नियंत्रक के init विधि में अधिसूचना की सदस्यता लें।

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

अपने नियंत्रक में "updateStuff" विधि को लागू करें और आप जो कुछ भी आप चाहते हैं जब एप्लिकेशन सक्रिय हो जाता है ऐसा करने में सक्षम होना चाहिए।

+0

धन्यवाद, यह बहुत अच्छा काम करता है, सुझाए गए लोगों का सबसे अच्छा दृष्टिकोण प्रतीत होता है। हालांकि मैं पर्यवेक्षक को सही तरीके से हटाने के बारे में थोड़ा चिंतित हूं। मैं व्यू कंट्रोलर का एक गुच्छा सामान्य रूप से उपयोग कर रहा हूं ताकि वे लोड हो जाएं और बहुत अधिक लोड हो जाएं। मैं addObserver को कॉल करता हूं - (शून्य) viewDidLoad हटाने में ऑब्सर्वर - (शून्य) viewDidUnload। ठीक काम करने लगता है। मैं आगे परीक्षण करूंगा ... –

+0

[[NSNotificationCenter defaultCenter] को हटाने के लिए मत भूलना ओब्सर्वर: स्वयं का नाम: @ "appDidBecomeActive" ऑब्जेक्ट: nil]; viewDidUnload –

+2

को डेलोक में ओब्सर्वर को हटाने के लिए नहीं भूलना चाहिए क्योंकि सभी कई परिदृश्यों में DidUnload को कॉल नहीं किया जाएगा –

0

कौन सा व्यू कंट्रोलर चालू है, इसका ट्रैक रखने की कोशिश करने के बजाय, आप अपने ऐपडिलेगेट से एनएस नॉटिफिकेशन भेज सकते हैं और अपने व्यू कंट्रोलर में इसकी सदस्यता ले सकते हैं .. इस तरह व्यू कंट्रोलर ट्रैक करता है कि इसे viewDidAppear को कॉल करने की आवश्यकता है या नहीं।

+0

हां यही वह है जो मैंने साथ किया है। कुल समझ में आता है क्योंकि मेरे अधिकांश नियंत्रकों को पंजीकरण करने की आवश्यकता नहीं है। –

0

आपके ऐपडिलेगेट में खिड़की की संपत्ति होगी, उस विंडो में रूटव्यू कंट्रोलर संपत्ति होगी। आप यहां अपना व्यू कंट्रोलर पा सकते हैं।

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

UIViewController *rootViewController = [[[[UIApplication sharedApplication] delegate] window] rootViewController]; 
if ([rootViewController isKindOfClass:[UITabBarController Class]]) 
    rootViewController = ((UITabBarController *)rootViewController).selectedViewController; 
else if ([rootViewController isKindOfClass:[UINavigationController Class]]) 
    rootViewController = ((UINavigationController *)rootViewController).topViewController; 

[rootViewController viewDidAppear]; 

आप नेविगेशन नियंत्रकों, या मोडल विचारों के साथ एक अधिक जटिल दृश्य पदानुक्रम है, तो आप presentedViewController, या topViewController पर कॉल कर सकते हैं।

+0

यह विंडो प्रॉपर्टी मेरे लिए काम नहीं कर रही है, यह मुझे यह त्रुटि देता है: अविकसित पहचानकर्ता 'विंडो' का उपयोग। क्या आप उत्तर को अपडेट कर सकते हैं क्योंकि मुझे वास्तव में यह जानने की ज़रूरत है कि स्क्रीन पर कौन सा दृश्य है और फिर इसे अपडेट करें। – Hamid

+0

@Rose अद्यतन देखें –

+0

अद्यतन के लिए धन्यवाद, मैंने इसे बदल दिया है और यह एक अपवाद फेंकता है जैसा कि निम्नलिखित है: 'अज्ञात चयनकर्ता उदाहरण के लिए भेजा गया है :((कोड की इस पंक्ति के लिए: 'UIViewController * vc = tabbarController.selectedViewController;' – Hamid

51
इसके बजाय अपने अनुप्रयोग प्रतिनिधि से सूचना भेजकर की

, ओएस स्वचालित रूप से एक सूचना भेजता है कि आप देख सकते हैं:

[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(initSongInfo) 
              name:UIApplicationDidBecomeActiveNotification 
              object:nil]; 

और निश्चित रूप से पहले या अपने dealloc विधि के अंदर कुछ समय के अवलोकन को रोकने के लिए, को फोन करके यह सुनिश्चित कर लें :

[[NSNotificationCenter defaultCenter] removeObserver:self 
               name:UIApplicationDidBecomeActiveNotification 
               object:nil]; 
+3

यह है ब्रैंडन ब्रोडजेस्की द्वारा वर्तमान में स्वीकृत उत्तर की तुलना में एक बेहतर समाधान। – MattyG

+2

यह करने का यह सही तरीका है – nilloc

1

स्विफ्ट संस्करण:

आप अपने viewDidLoad में इस पंक्ति में जोड़ सकते हैं

NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(viewDidBecomeActive), name: UIApplicationDidBecomeActiveNotification, object: nil) 

func viewDidBecomeActive(){ 
    print("viewDidBecomeActive") 
} 
संबंधित मुद्दे