मुझे स्विफ्ट में ऐप के प्रतिनिधि के लिए एक संदर्भ कैसे मिलेगा?


409

मुझे स्विफ्ट में ऐप के प्रतिनिधि के लिए एक संदर्भ कैसे मिलेगा?

अंततः, मैं प्रबंधित ऑब्जेक्ट संदर्भ तक पहुंचने के लिए संदर्भ का उपयोग करना चाहता हूं।


8
ध्यान दें कि कुछ प्रबंधित वस्तु संदर्भ या अन्य "वैश्विक" वस्तुओं के लिए एक प्रतिनिधि के रूप में एक प्रतिनिधि के रूप में एक प्रतिनिधि के रूप में अनुप्रयोग प्रतिनिधि के उपयोग पर विचार करेंगे। एप्लिकेशन प्रतिनिधि को नियंत्रक को MOC पास करने पर विचार करें, बजाय नियंत्रक को खोजने के।
क्रिस्टोफर जॉनसन

1
@ क्रिस्टोफर जॉनसन हे क्रिस, मैं ऐपडेलगेट इंजेक्शन निर्भरता को देखने वाले नियंत्रकों में कैसे सुविधा दे सकता हूं? प्रोग्राम कंट्रोलर को तुरंत क्रिएट करें और रिफ्रेशमेंट / इंजेक्ट करने के लिए प्रतिबिंब का उपयोग करें, रिकर्सिवली? क्या कोई रूपरेखा है जो इसके साथ मदद कर सकती है? यदि मुझे मैन्युअल रूप से प्रत्येक दृश्य नियंत्रक के लिए ऐसा करना है, तो मेरा AppDelegate बहुत बड़ा होने जा रहा है! ओह, अधिमानतः सब कुछ के लिए एक कारखाना बनाए बिना :)
जिम्बो

1
एक सरसरी खोज पाया Swinject जो भी ऑटो तारों है :)
Jimbo

6
प्रोग्रामर जो एप्लिकेशन प्रतिनिधि में कुछ भी "बाहरी" डालने के खिलाफ सलाह के लिए, यह थोड़ा बकवास क्योंकि एप्पल प्रलेखन स्पष्ट रूप से कहा है कि एक है "crucial role"की UIApplicationDelegateसिंगलटन है "...to store your app’s central data objects or any content that does not have an owning view controller." developer.apple.com/documentation/uikit/uiapplicationdelegate
बीएसओडी

जवाबों:


757

अन्य समाधान सही है कि यह आपको आवेदन के प्रतिनिधि के संदर्भ में मिलेगा, लेकिन यह आपको आपके प्रबंधित ऑब्जेक्ट संदर्भ की तरह, UIApplication के उपवर्ग द्वारा जोड़े गए किसी भी तरीके या चर तक पहुंचने की अनुमति नहीं देगा। इसे हल करने के लिए, बस "AppDelegate" को डाउनकास्ट करें या कभी भी आपके UIApplication उपवर्ग को कहा जाता है। में स्विफ्ट 3, 4 और 5 , इस रूप में निम्न प्रकार से किया जाता है:

let appDelegate = UIApplication.shared.delegate as! AppDelegate
let aVariable = appDelegate.someVariable

10
यदि किसी को अभी भी समस्या है, तो OS X को लक्षित करने के लिए आपको NSApplication.saredApplication () के लिए काम करने के लिए कोको को आयात करना होगा। मुझे लगता है कि iOS को समकक्ष की आवश्यकता होगी।
स्मारिस

2
यह दो उत्तरों का अधिक उपयोगी है।
जो

3
@zacjordaan उस पद्धति का उपयोग करके, आपको संपत्ति के लिए स्वत: पूर्णता मिलेगी, लेकिन यह वास्तव में काम नहीं करेगा। हर बार जब आप इसका उपयोग करते हैं तो यह तरीका ऐपडेलगेट वर्ग का एक नया उदाहरण बना देगा। शेयर्ड एप्लीकेशन सिंग्लटन के माध्यम से सुलभ प्रतिनिधि के उपयोग से आप बेहतर हैं। और जहाँ तक आपका दूसरा प्रश्न है, हाँ आप शायद एक स्थिरांक का उपयोग करना चाहते हैं। भले ही, आप AppDelegate की संपत्तियों को बदल रहे हों, आप संभवत: पॉइंटर को किसी और चीज के लिए फिर से असाइन नहीं कर रहे होंगे, जिस स्थिति में, चर की कोई आवश्यकता नहीं है। यह पूरी तरह से आप पर निर्भर है। वह करें जो आपकी आवश्यकताओं के अनुरूप हो।
मिक मैक्लम

2
बहुत बढ़िया सलाह! मैंने गलती से सोचा था कि AppDelegate () सिंगलटन था, लेकिन आपने जो कहा है, उसके बारे में सोचने के बाद मैंने महसूस किया है कि अगर यह तब था, तो इस तरह से उपयोग करने के लिए हमारे लिए एक साझाकरण पैटर्न नहीं होगा। अगर मैं नहीं करना चाहता, तो बेशक मैं बेवजह के उदाहरण नहीं देना चाहता, इसलिए आपकी निरंतर घोषणा पूरी तरह से लागू होगी; धन्यवाद।
zacjordaan

4
मैं इसे अलग-अलग उत्तर के रूप में नहीं जोड़ना चाहता, लेकिन AppDelegate को अपने तरीकों से प्राप्त करने के लिए, परियोजना में गुण जहां एक स्विफ्ट और एक ओब्ज-सी दोनों का उपयोग किया जाता है आपको "ProjectName-BridgingHeader में #import" AppDelegate.h "जोड़ना चाहिए। .एच। "
मैरिएन मिर्जेवेस्की

44

स्विफ्ट 4.2

स्विफ्ट में, अपने वीसी के उपयोग में आसान

extension UIViewController {
    var appDelegate: AppDelegate {
    return UIApplication.shared.delegate as! AppDelegate
   }
}

25

सुविधा कंस्ट्रक्टर

कोड के अंत में AppDelegate क्लास में जोड़ें

स्विफ्ट 5

func appDelegate() -> AppDelegate {
    return UIApplication.shared.delegate as! AppDelegate
}

अपनी कक्षा में AppDelegate संदर्भ का उपयोग करने के लिए?


AppDelegate विधि को कॉल करें

AppDelegate ()। setRoot ()


यह समझाने के लिए बहुत अच्छा होगा कि सेटरूट () क्या करता है और इसे कब कॉल करना है। उदाहरण के लिए इसे ViewController से कॉल करना ठीक है? एक इकाई परीक्षण से जहां खिड़की अभी तक सेट नहीं हुई है? अधिक संदर्भ महान होगा।
होउमैन

@Houman setRoot AppDelegate की एक विधि है जिसका उपयोग कई रूट या पेरेंटव्यूकंट्रोलर के बीच स्विच करने के लिए किया जा सकता है और यह कोई भी तरीका हो सकता है। चर्चा यह है कि आगे पहुंचने के लिए ऐपडेलगेट के संदर्भ को कैसे प्राप्त किया जाए, लेकिन आशा है कि सेटरूट भी स्पष्ट होना चाहिए।
एआईओएसएन

19

यह बहुत उद्देश्य-सी के रूप में ही है

let del = UIApplication.sharedApplication().delegate

19

इसे OS X के लिए इस्तेमाल किया जा सकता है

let appDelegate = NSApplication.sharedApplication().delegate as AppDelegate
var managedObjectContext = appDelegate.managedObjectContext?

3
या बसlet appDelegate = NSApp.delegate as AppDelegate
व्लादिमीर प्रुडनिकोव

1
में स्विफ्ट 3 उपयोगlet appDelegate = NSApplication.shared().delegate as AppDelegate
एक प्रकार की कटार

4
में स्विफ्ट 4 :NSApp.delegate as? AppDelegate
निक

12

यहाँ स्विफ्ट 2.0 संस्करण है:

let delegate = UIApplication.sharedApplication().delegate as? AppDelegate

और प्रबंधित वस्तु संदर्भ का उपयोग करने के लिए:

    if let delegate = UIApplication.sharedApplication().delegate as? AppDelegate {

        let moc = delegate.managedObjectContext

        // your code here

    }

या, गार्ड का उपयोग कर:

    guard let delegate = UIApplication.sharedApplication().delegate as? AppDelegate  else {
        return
    }

    let moc = delegate.managedObjectContext

    // your code here

10

स्विफ्ट <3

पूर्व के लिए AppDelegate क्लास में एक विधि बनाएँ

func sharedInstance() -> AppDelegate{
        return UIApplication.sharedApplication().delegate as! AppDelegate
    }

और इसे कुछ और जहां पूर्व के लिए कहते हैं

let appDelegate : AppDelegate = AppDelegate().sharedInstance()

स्विफ्ट> = 3.0

func sharedInstance() -> AppDelegate{
    return UIApplication.shared.delegate as! AppDelegate
}

2
यह भी काम करता है, और मैं साझा नामकरण के विचार को पसंद करता हूं। धन्यवाद!
जॉन ग्रिफिथ्स 1

2
आपका उदाहरण अभी भी AppDelegateहर बार जब आप बुलाया एक नई वस्तुAppDelegate().sharedInstance()
pxpgraphics

1
मुझे यह समाधान स्वीकार किए गए की तुलना में बेहतर लगता है (जो कि "अनिश्चित रूप से" क्रिया है यदि आपको इसे सभी में उपयोग करना है)। मैं इस जवाब extensionको पाने NSApplicationसे पहले एक के लिए प्रयोग करने के बारे में सोच रहा था , लेकिन यह बहुत बेहतर है। आजकल आप शायद एक वर्ग की गणना पढ़ी हुई संपत्ति का उपयोग sharedकरना चाहेंगे, हालांकि, शायद आप स्विफ्ट 3 के लिए एक अपडेट पोस्ट करना चाहेंगे?
पटरू

1
मैं वास्तव में अपने कोड को फिर से उपयोग करने की प्रक्रिया में हूं static var shared : TournamentDelegate? { get { return NSApplication.shared().delegate as? TournamentDelegate } }जो कि इस प्रकार की चीजों के लिए केवल पढ़ी गई संपत्तियों के उपयोग की विकासशील स्विफ्ट 3 शैली के अनुरूप है। मैं शायद ?एक बार refactoring किया जाता है ड्रॉप करने में सक्षम हो जाएगा , आपको नहीं लगता? (क्षमा करें, टिप्पणियों में कोड स्वरूपण हमेशा एक गड़बड़ है।)
पटरू

@ pxpgraphics UIApplication एक एकल वर्ग है, इसलिए कई तात्कालिकता के बारे में चिंता करने की आवश्यकता नहीं है।
अभिजीत


6

बस इसे आज़माएं:

स्विफ्ट 4

// Call the method
(UIApplication.shared.delegate as? AppDelegate)?.whateverWillOccur()

आपके AppDelegate में कहां:

// MARK: - Whatever
func whateverWillOccur() {

    // Your code here.

}

5

यहाँ इसके लिए एक विस्तार दिया गया है UIApplicationDelegateजो AppDelegateवर्ग के नाम के हार्डकोडिंग से बचता है :

extension UIApplicationDelegate {

    static var shared: Self {    
        return UIApplication.shared.delegate! as! Self
    }
}

// use like this:
let appDelegate = MyAppDelegate.shared // will be of type MyAppDelegate

मैक पर इसके लिए NSApplicationDelegateमुझे देता है 'Self' is only available in a protocol or as the result of a method in a class; did you mean 'AppDelegate'?:। क्या यह पुराना है?
23

@pkamb मैंने अभी इसे एक नए प्रोजेक्ट में आज़माया है और मेरे पास यह त्रुटि नहीं है। मैं प्रतिस्थापित UIApplicationDelegateद्वारा NSApplicationDelegateऔर UIApplicationद्वारा NSApplication
18


4

यह बहुत ही सरल है

अनुप्रयोग प्रतिनिधि उदाहरण

let app = UIApplication.shared.delegate as! AppDelegate

आप एक पंक्ति सिंटैक्स के साथ एक विधि कह सकते हैं

app.callingMethod()

आप इस कोड के साथ एक चर का उपयोग कर सकते हैं

app.yourVariable = "Assigning a value"

2

मेरे मामले में, मैं import UIKitअपने NSManagedObjectउपवर्ग के ऊपर से गायब था । इसे आयात करने के बाद, मैं उस त्रुटि को हटा सकता हूं जैसा UIApplicationकि इसका हिस्सा हैUIKit

आशा है कि यह दूसरों की मदद करता है !!!


2

मैं स्विफ्ट 2.3 में इसका उपयोग करता हूं।

1. AppDelegate वर्ग

static let sharedInstance: AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate

2. कॉल AppDelegate के साथ

let appDelegate = AppDelegate.sharedInstance

2
extension AppDelegate {

    // MARK: - App Delegate Ref
    class func delegate() -> AppDelegate {
        return UIApplication.shared.delegate as! AppDelegate
    }
}

2

IOS 12.2 और स्विफ्ट 5.0 के रूप में, AppDelegateएक मान्यता प्राप्त प्रतीक नहीं है। UIApplicationDelegateहै। AppDelegateइसीलिए कोई भी उत्तर अब सही नहीं है। निम्नलिखित उत्तर सही है और बल-अलंकार को टालता है, जिसे कुछ डेवलपर्स एक कोड गंध मानते हैं:

import UIKit

extension UIViewController {
  var appDelegate: UIApplicationDelegate {
    guard let appDelegate = UIApplication.shared.delegate else {
      fatalError("Could not determine appDelegate.")
    }
    return appDelegate
  }
}

1
स्विफ्ट 5 में आपका कोड "UIApplication.delegate को मुख्य धागे से केवल चेतावनी" का उपयोग करना होगा। क्या आप जवाब अपडेट कर सकते हैं
महेश नरला

कि fatalErrorकार्यात्मक एक शक्ति खोलने में बराबर है!
pkamb

1

स्विफ्ट 3.0 में आप appdelegateसंदर्भ प्राप्त कर सकते हैं

let appDelegate = UIApplication.shared.delegate as! AppDelegate

0

Xcode 6.2 में, यह भी काम करता है

let appDelegate = UIApplication.sharedApplication().delegate! as AppDelegate

let aVariable = appDelegate.someVariable

2
v01d, आपने कहाँ से लिया है?
NSPratik
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.