2013-02-10 28 views
11

हैलो, बनाई गई है मैं एक ऐप्स जब एक स्थानीय notifcation इसे खोलने के लिए प्रयोग किया जाता है कि एक यूआई अद्यतन और एक आंतरिक स्थिति परिवर्तन के साथ जवाब देना चाहिए लिख रहा हूँ। मैं स्टोरीबोर्ड का उपयोग कर रहा हूँ और मैं स्थिति परिवर्तन निरीक्षण करने के लिए अपने मुख्य दृश्य नियंत्रक की स्थापना की है:आवेदन: didFinishLaunchingWithOptions: अधिसूचना फायरिंग से पहले गंतव्य नियंत्रक

- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification 
{ 
    if (application.applicationState == UIApplicationStateInactive) 
    { 
     [[NSNotificationCenter defaultCenter] postNotificationName:@"Resume" object:self userInfo:notification.userInfo]; 
    } 
} 

और यह ठीक काम करता है:: मेरे ऐप प्रतिनिधि में

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // ... 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(resumeByNotification:) name:@"Resume" object:nil]; 
} 

मैं इस अगर अनुप्रयोग है पृष्ठभूमि में चल रहा है, दृश्य नियंत्रक अधिसूचना को रोक देगा और तदनुसार प्रतिक्रिया करेगा। (एप्लिकेशन को अग्रभूमि में चल रहा है, इसकी वजह यूआई सीधे का ध्यान रखा जा रहा है पर ध्यान नहीं दिया है।)

समस्या पैदा होती है जब एप्लिकेशन को मार डाला गया है और सूचना प्राप्त होने पर। मैं didFinishLaunchingWithOptions विधि में इस लिखा है, एक त्वरित डिबग तकनीक :) के रूप में होने पर फ़ोन कंपन रही है, और मैं अधिसूचना मिलता है :

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    UILocalNotification *localNotification = launchOptions[UIApplicationLaunchOptionsLocalNotificationKey]; 
    if (localNotification) 
    { 
     [[NSNotificationCenter defaultCenter] postNotificationName:@"Resume" object:self userInfo:localNotification.userInfo]; 
     AudioServicesPlaySystemSound(kSystemSoundID_Vibrate); 
    } 

    return YES; 
} 

फोन कंपन करता है तो अधिसूचना नहीं है, लेकिन ऐसा नहीं पर्यवेक्षक ट्रिगर नहीं लग रहा है। मुझे लगता है कि ऐसा इसलिए है क्योंकि व्यू कंट्रोलर की didViewLoad विधि अभी तक नहीं बुलाई गई है। मुझे यकीन नहीं है कि इसे कैसे काम करना है। मुझे लगता है मैं इस्तेमाल कर सकते हैं UIStoryboard के instantiateViewControllerWithIdentifier लगता है: विधि यकीन है कि दृश्य नियंत्रक वास्तव में नहीं है बनाने के लिए है, लेकिन मैं इसके बारे में एक "अतिरिक्त" उदाहरण के लिए हो रही नहीं किया जाएगा, एक है कि अंततः स्टोरीबोर्ड के स्वयं के जीवन चक्र द्वारा instantiated हो जाएगा के अलावा ? कक्षा संदर्भ दस्तावेज पर क्या कहता है, यह इस तरह की चीज करने के लिए बिल्कुल सही नहीं है।

मैं यहाँ बहुत स्पष्ट कुछ याद आ रही है? असल में, क्या इस तरह की स्थिति के लिए मेरा दृष्टिकोण सही है?

धन्यवाद! जब तक कुछ अपने दृश्य के लिए यह पूछता है

उत्तर

11

दृश्य नियंत्रक अपने दृश्य लोड नहीं करता है। लॉन्च समय पर, आमतौर पर application:didFinishLaunchingWithOptions: रिटर्न के बाद होता है।

आप क्यों आश्चर्य हो सकता है। जवाब यह है कि आप लॉन्च टाइम पर कई व्यू कंट्रोलर को तुरंत चालू कर सकते हैं, जिनमें से कुछ छुपाए गए हैं। उदाहरण के लिए, यदि आपके खिड़की के रूट दृश्य नियंत्रक एक UINavigationController है, तो आप दृश्य नियंत्रक (ढेर है कि उपयोगकर्ता पिछली बार एप्लिकेशन भाग गया धक्का दिया था) के एक ढेर के साथ नेविगेशन नियंत्रक लोड हो सकती हैं। इस स्टैक का केवल शीर्ष दृश्य नियंत्रक दृश्यमान है, इसलिए अन्य दृश्य नियंत्रकों के विचारों को लोड करने की आवश्यकता नहीं है। प्रणाली किसी भी विचार को लोड करने से पहले application:didFinishLaunchingWithOptions: रिटर्न तक प्रतीक्षा करती है ताकि केवल आवश्यक विचार लोड हो जाएंगे।

तो आपकी समस्या के आसपास काम करने का एक तरीका बस दृश्य नियंत्रक से इसके विचार के लिए पूछना होगा, इस प्रकार इसे लोड करने के लिए मजबूर होना होगा।

- (id)initWithCoder:(NSCoder *)aDecoder { 
    if (self = [super initWithCoder:aDecoder]) { 
     [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(resumeByNotification:) name:@"Resume" object:nil]; 
    } 
    return self; 
} 

यह:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    UILocalNotification *localNotification = launchOptions[UIApplicationLaunchOptionsLocalNotificationKey]; 
    if (localNotification) { 
     [[self.window rootViewController] view]; 
     [[NSNotificationCenter defaultCenter] postNotificationName:@"Resume" object:self userInfo:localNotification.userInfo]; 
     AudioServicesPlaySystemSound(kSystemSoundID_Vibrate); 
    } 

    return YES; 
} 

एक अलग तरीके को अपना दृश्य नियंत्रक के initWithCoder: विधि में अधिसूचना को देख शुरू करने के लिए होगा: आपके विचार नियंत्रक खिड़की के रूट दृश्य नियंत्रक है, तो आप इसे इस तरह से कर सकते हैं कहा जाता है जब व्यू कंट्रोलर मेनस्टोरीबोर्ड से तत्काल होता है, जो application:didFinishLaunchingWithOptions: संदेश से पहले होता है।

+0

'initWithcoder:' का उपयोग करके धन्यवाद, एक आकर्षण की तरह काम किया। किसी ऑब्जेक्ट के जीवन चक्र में ये सभी कदम काफी भ्रमित हो सकते हैं। :) – Jollino

+0

धन्यवाद, यह भी काम करता है यदि आप स्थानीय नोटिफिकेशन के बजाय पुश नोटिफिकेशन का उपयोग कर रहे हैं और कोई स्टोरीबोर्ड नहीं है। बस 'init' विधियों का उपयोग करें। – yoeriboven

+0

['init (कोडर:)'] (https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Protocols/NSCoding_Protocol/index.html#//apple_ref/occ/intfm/NS कोडिंग/initWithCoder :) –