AppDelegate उदाहरण चर का संदर्भ


84

मेरे पास एक परियोजना है जो नेविगेशन आधारित अनुप्रयोग टेम्पलेट पर आधारित है। AppDelegate में तरीके -applicationDidFinishLoading:और हैं -applicationWillTerminate:। उन विधियों में, मैं एप्लिकेशन डेटा लोड कर रहा हूं और सहेज रहा हूं, और इसे इंस्टेंस वेरिएबल में स्टोर कर रहा हूं (यह वास्तव में ऑब्जेक्ट-ग्राफ है)।

जब एप्लिकेशन लोड होता है, तो यह MainWindow.xib को लोड करता है, जिसमें एक नेविगेशनकोनोलर है, जिसके बदले में रूटव्यूऑन कंट्रोलर है। RootViewController nibNameसंपत्ति RootView (मेरा वास्तविक नियंत्रक वर्ग) को इंगित करता है।

मेरी कक्षा में, मैं उस वस्तु को संदर्भित करना चाहता हूं जो मैंने -applicationDidFinishLoading:विधि में बनाई थी , ताकि मुझे इसका संदर्भ मिल सके।

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

जवाबों:


204

चर (आमतौर पर मॉडल डेटा संरचना) के लिए जिसे मुझे ऐप में कहीं भी एक्सेस करने की आवश्यकता होती है, उन्हें अपने AppDelegate वर्ग में घोषित करें। जब आपको इसे संदर्भित करने की आवश्यकता हो:

YourAppDelegate *appDelegate = (YourAppDelegate *)[[UIApplication sharedApplication] delegate];
//and then access the variable by appDelegate.variable 

7
मैंने इसे एक वोट दिया क्योंकि आपने कलाकारों को जोड़ा, आपको अपने स्वयं के प्रकार के लिए ऐपडेलगेट डालना होगा ताकि आप अपने स्वयं के गुणों को सेट कर सकें। हालांकि आप "AppDelegate" को कास्टिंग न करके इसे और अधिक स्पष्ट करने के लिए संपादित कर सकते हैं ...
केंडल हेल्मेटेटर जेलर

क्या ऐप प्रतिनिधि नाम या इसके किसी सदस्य के संदर्भ के बिना रूट व्यू कंट्रोलर तक पहुंचने का कोई तरीका है? (मैं कुछ पोर्टेबल कोड लिखना चाहूंगा जो रूट व्यू कंट्रोलर की जरूरत है।)
SK9

SK9, प्रत्येक iOS ऐप में एक ऐपडेलगेट होना आवश्यक है, इसलिए कोड पोर्टेबल होगा!
डेनियल

16

यदि मैं आपके प्रश्न को समझता हूं, तो आप अपने AppDelegate ऑब्जेक्ट में सदस्य चर / संपत्तियों को संदर्भित करना चाहते हैं? अपनी वस्तु का संदर्भ वापस करने के लिए सबसे सरल तरीका [[UIApplication sharedApplication] प्रतिनिधि] का उपयोग करना है।

यदि आपको विंडो नामक एक संपत्ति मिली है, तो आप ऐसा कर सकते हैं:

UIWindow   *mainWindow = [[[UIApplication sharedApplication] delegate] window];
//do something with mainWindow

11

यहाँ iOS4.0 और ऊपर के लिए एक अच्छी तरह से परिभाषित पोर्टेबल विकल्प है:

UIApplication *myApplication = [UIApplication sharedApplication];
UIWindow *mainWindow = [myApplication keyWindow];
UIViewController *rootViewController = [mainWindow rootViewController];

या, एक पंक्ति में,

UIViewController *rootViewController = [[[UIApplication sharedApplication] keyWindow] rootViewController];

खिड़की की rootViewControllerसंपत्ति (आईबी में कहें) सेट करने के लिए मत भूलना या यह जैक करेगा।


2

एक मैक्रो को परिभाषित करें और इसे कहीं भी उपयोग करें!

#define appDelegateShared ((AppDelegate *)[UIApplication sharedApplication].delegate)

मेरे कोड में: -

UIViewController *rootViewController = appDelegateShared.window.rootViewController;
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.