2012-04-04 14 views
55

मेरे पास एक आईओएस ऐप है जिसे मैंने एक्सकोड में "व्यू-आधारित ऐप" के रूप में बनाया है। मेरे पास केवल एक दृश्य नियंत्रक है, लेकिन यह स्वचालित रूप से प्रदर्शित होता है, और मुझे कोई कोड नहीं दिखता है जो इसे मेरे ऐप डिलीगेट से जोड़ता है। मुझे अपने ऐप से डेटा को मेरे दृश्य नियंत्रक को पास करने की आवश्यकता है, लेकिन यह नहीं पता कि उसे कैसे खींचें।मैं अपने ऐप डिलीगेट से अपने व्यू कंट्रोलर तक कैसे पहुंच सकता हूं? आईओएस

मेरा ऐप delegate.h:

#import <UIKit/UIKit.h> 


@interface AppDelegate : UIResponder <UIApplicationDelegate> 

@property (strong, nonatomic) UIWindow *window; 
@property (strong, nonatomic) NSDictionary *queryStrings; 

@end 

इसके अलावा, appDidFinishLoadingWithOptions:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    // Override point for customization after application launch. 
    [[JMC sharedInstance] configureJiraConnect:@"https://cmsmech.atlassian.net/"   projectKey:@"WTUPLOAD" apiKey:@"7fc060e1-a795-4135-89c6-a7e8e64c4b13"]; 

    if ([launchOptions objectForKey:UIApplicationLaunchOptionsURLKey] != nil) { 
     NSURL *url = [launchOptions objectForKey: UIApplicationLaunchOptionsURLKey]; 
     NSLog(@"url received: %@", url); 
     NSLog(@"query string: %@", [url query]); 
     NSLog(@"host: %@", [url host]); 
     NSLog(@"url path: %@", [url path]); 
     queryStrings = [self parseQueryString:[url query]]; 
     NSLog(@"query dictionary: %@", queryStrings); 
    } 
    else { 
     queryStrings = [self parseQueryString:@"wtID=nil"]; 
    } 

    return YES; 
} 

उत्तर

90

आप के साथ उपयोग कर सकते हैं:

MyViewController* mainController = (MyViewController*) self.window.rootViewController; 

आप एक tabviewcontroller पीछे आपके विचार घोंसला बनाने से रहे हैं, तो या नेविगेशन नियंत्रक यह आपको वापस कर देगा और आपको अपने व्यू कंट्रोलर i तक पहुंचने की आवश्यकता होगी इसका nside

+1

क्षमा करें, इस संदर्भ में 'self' क्या है? क्या आप UIAplplicationDelegate में '-विंडो' संपत्ति का जिक्र कर रहे हैं? यदि ऐसा है, तो केवल आईओएस 5+ - बस एक सिर-अप। –

+0

@ कॉनराडशल्ट्ज हाँ, यह यूआईएप्लिकेशंस डिलेगेट था। यह जानना महत्वपूर्ण है, धन्यवाद! – utahwithak

+0

मुझे यकीन नहीं है कि यह करने का यह सबसे अच्छा या एकमात्र तरीका है, लेकिन इस तरह मैंने इसे करने का फैसला किया और यह ठीक काम करता है। धन्यवाद। – HackyStack

20

किसी भी व्यक्ति को सुनने के लिए अपने ऐप प्रतिनिधि से संदेश भेजने के लिए अच्छे पुराने फैशन NSNotifications का उपयोग करने के बारे में कैसे करें (उदा। आपका विचार contorller) कि कुछ अद्यतन करने की जरूरत है? या आप Key Value Observing का उपयोग कर सकते हैं ताकि आपका व्यू कंट्रोलर आपके ऐप प्रतिनिधि में कुछ संपत्ति देख सके।

UIViewController *vc = [[[UIApplication sharedApplication] keyWindow] rootViewController]; 
+1

+1 ... अन्य विकल्प स्पेगेटी गोंद कोड पर ले जा सकते हैं। –

+0

NSNotificationCenter कमजोर युग्मित संबंधों के लिए अच्छा है। यदि इस परियोजना में एक ही विचार है, तो कड़े संबंधों के कारण प्रतिनिधिमंडल बेहतर दृष्टिकोण हो सकता है। – jmstone617

+0

@jmstone - रूट प्रतिनिधि नियंत्रक को एप्लिकेशन प्रतिनिधि के * प्रतिनिधि * बनाएं? अवधारणात्मक रूप से ऐसा लगता है लेकिन यह निश्चित रूप से संभावित रूप से भ्रमित लगता है, खासकर नौसिखिया उद्देश्य सी लोगों के लिए। –

12

आप केवल एक ही दृश्य नियंत्रक, सामान्य तरीके से (अपने ऐप स्थापित किया गया था के स्वतंत्र है) के बाद से आपके ऐप प्रतिनिधि में एक संपत्ति के माध्यम से। यह वही व्यू कंट्रोलर है जो नेविगेशन नियंत्रक के रूट व्यू कंट्रोलर के रूप में सेट हो जाता है।

अगर किसी कारण से आपकी परियोजना अलग-अलग स्थापित की गई थी, तो आप विंडो के रूट व्यू कंट्रोलर प्राप्त कर सकते हैं, जो नेविगेशन नियंत्रक होना चाहिए, और उसके बाद उसका शीर्ष व्यू कंट्रोलर प्राप्त करें।

संपादित करें: तो मुद्दा यह है: iOS5 और स्टोरीबोर्ड के साथ, एप्पल प्रारंभिक की स्थापना का एक बहुत है कि आप का उपयोग करने की (और अब भी अगर आप स्टोरीबोर्ड से बाहर निकलना है) का इस्तेमाल किया निकाला गया है । उन्होंने मुख्य() को दिए गए तर्कों को बदल दिया है और स्टोरीबोर्ड में सेट अप करने के लिए अधिक कुछ किया है (जो वास्तव में केवल एक निब है)। आईएमएचओ, यह लोगों को भारी संचालन के साथ ऐपडिलेगेट को ओवरलोड करने से रोकने के लिए है, ऐसा लगता है कि आप अपने में कर रहे हैं। ऐपडिलेगेट, संक्षेप में, एप्लिकेशन लाइफसाइकिल का प्रबंधन करने के लिए मौजूद है। यह वास्तव में उन तरीकों का प्रदर्शन करने के लिए नहीं है जो आपके दृश्य नियंत्रकों को जानकारी देते हैं। डेटा देखने के लिए भारी उठाने के लिए, वास्तव में, यह आपके व्यू कंट्रोलर का काम है। मैं कोड को आपके व्यू कंट्रोलर में ले जाने का सुझाव दूंगा, शायद डीडलोड में देखें। यदि आपको लॉन्च ऑप्शन ऑब्जेक्ट के परिणाम को जानने की आवश्यकता है तो फोर्के टेस्ट ऐसा प्रतीत होता है कि आप कर रहे हैं, आप बस अपने ऐपडिलेगेट पर एक संपत्ति बना सकते हैं, BOOL launchOptionsURLKeyExists कहें, और इसे उचित रूप से सेट करें। फिर आप अपने व्यू कंट्रोलर में इस संपत्ति का मूल्य लें। जब दृश्य आपके विचार नियंत्रक में UIApplicationDidEnterForegroundNotification अधिसूचना में जोड़ा जाता है viewWillAppear/viewDidAppear कहा जाता हो जाता है और: आप पहले से ही एक AppDelegate सिंगलटन, ताकि आप इसे या तो [UIApplication sharedApplication] .delegate

संपादित 2 से एक्सेस कर सकते हैं उस संदेश को पोस्ट करते समय उचित जवाब दें।

0

यदि आप दृश्य-आधारित अनुप्रयोग टेम्पलेट का उपयोग किया, एकल दृश्य नियंत्रक सुलभ होना चाहिए:

+0

कोई संपत्ति नहीं है और मुझे नहीं पता कि यह कहां सेट है, यही वह है जो मैं कह रहा हूं ... यह कहां सेट है ??? यहां मेरा ऐप डिलीगेट है। # :पोर्ट HackyStack

+0

मैंने अपनी प्रतिक्रिया संपादित की है। मैंने स्टोरीबोर्ड का कभी भी उपयोग नहीं किया, इसलिए मैं अब इस सामान को बहुत सारे अमूर्त भूल गया। – jmstone617

+0

समस्या तब होती है जब ऐप सक्रिय हो जाता है, मुझे नई क्वेरी स्ट्रिंग को खींचने और इसे मेरे व्यू कंट्रोलर पर ले जाने की आवश्यकता होती है, लेकिन एप प्रतिनिधि पर सक्रिय होने वाले ऐप पर लागू होने वाली एकमात्र विधि (इच्छात्मक क्रिया या जो कुछ भी) होगी। मुझे देखने के लिए दृश्य नियंत्रक की आवश्यकता है कि यह एक अलग क्वेरी स्ट्रिंग के साथ सक्रिय हो सकता है ... – HackyStack

8

आप किसी भी अन्य UIViewController ही नहीं, rootViewController प्राप्त करना चाहते हैं:

UIWindow *window=[UIApplication sharedApplication].keyWindow; 
UIViewController *root = [window rootViewController]; 

UIStoryboard *storyboard = root.storyboard; 
CustomViewController *vcc =(CustomViewController *) [storyboard instantiateViewControllerWithIdentifier:@"storyBoardID"]; 
+0

यह सही उत्तर होना चाहिए –

+0

यह देखने में खुशी है कि मेरे उत्तर ने आपकी सहायता की है @ जेन्याकिर्मी:) –

3

स्विफ्ट तरह से यह करने के लिए, तो आप इस कहीं से भी कॉल कर सकते हैं, न सिर्फ AppDelegate:

/// EZSwiftExtensions - Gives you the VC on top so you can easily push your popups 
public var topMostVC: UIViewController? { 
    var presentedVC = UIApplication.sharedApplication().keyWindow?.rootViewController 
    while let pVC = presentedVC?.presentedViewController { 
     presentedVC = pVC 
    } 

    if presentedVC == nil { 
     print("EZSwiftExtensions Error: You don't have any views set. You may be calling them in viewDidLoad. Try viewDidAppear instead.") 
    } 
    return presentedVC 
} 

इसकी इसमें मानक फ़ंक्शन के रूप में शामिल किया गया:

https://github.com/goktugyil/EZSwiftExtensions

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