আমি কীভাবে সুইফটে অ্যাপের প্রতিনিধিটির একটি রেফারেন্স পেতে পারি?


409

আমি কীভাবে সুইফটে অ্যাপের প্রতিনিধিটির একটি রেফারেন্স পেতে পারি?

শেষ পর্যন্ত, আমি পরিচালিত অবজেক্ট প্রসঙ্গে অ্যাক্সেস করতে রেফারেন্সটি ব্যবহার করতে চাই।


8
মনে রাখবেন যে কেউ কেউ অ্যাপ্লিকেশন প্রতিনিধিটিকে পরিচালনা পর্বের প্রসঙ্গ বা অন্যান্য "গ্লোবাল" অবজেক্টগুলির জন্য একটি ধারক হিসাবে বিরোধী নিদর্শন হিসাবে বিবেচনা করবে। অ্যাপ্লিকেশন প্রতিনিধিটিকে কন্ট্রোলারটিকে সন্ধান না করে নিয়ন্ত্রণের কাছে এমওসি পাস করার বিষয়ে বিবেচনা করুন।
ক্রিস্টোফার জনসন

1
@ ক্রিস্টোফার জনসন আরে ক্রিস, আমি কীভাবে অ্যাডডেলিগেটকে ইনজেকশন ইনজেকশন নির্ভর নিয়ন্ত্রণগুলিতে সুবিধা করতে পারি? প্রোগ্রামটি নিয়মিতভাবে কন্ট্রোলার ইনস্ট্যান্ট করুন এবং পুনরাবৃত্তির মাধ্যমে কী ইনস্ট্যান্টিয়েট / ইনজেক্ট করবেন তা সিদ্ধান্ত নিতে প্রতিবিম্বটি ব্যবহার করুন? এমন কোনও ফ্রেমওয়ার্ক রয়েছে যা এর সাথে সহায়তা করতে পারে? যদি আমি নিজেই প্রতিটি ভিউ কন্ট্রোলারের জন্য এটি করতে পারি তবে আমার অ্যাপডেলিগেটটি বিশাল হতে চলেছে! ওহ, সমস্ত কিছুর জন্য কোনও কারখানা তৈরি না করেই :)
জিম্বো

1
একটি অভিশাপ অনুসন্ধানে সাইনজেক্টের সন্ধান পেয়েছে যার অটো-ওয়্যারিংও রয়েছে :)
জিম্বো

6
অ্যাপ্লিকেশন প্রতিনিধিদের মধ্যে "বহিরাগত" কোনও কিছু রাখার বিরুদ্ধে পরামর্শ দেওয়ার জন্য প্রোগ্রামাররা, এটি কিছুটা বোকামি কারণ অ্যাপল ডকুমেন্টেশনে স্পষ্টভাবে বলা হয়েছে যে সিঙ্গলটনের একটি ডেভেলপার । অ্যাপ্লিকেশন / ডকুমেন্টেশন "crucial role"/ UIApplicationDelegateইউইকিট / ইউইপলিকেশনডেলিগেট"...to store your app’s central data objects or any content that does not have an owning view controller."
বিএসড

উত্তর:


757

অন্যান্য সমাধানটি সঠিক যে এটি আপনাকে আবেদনের প্রতিনিধি হিসাবে একটি রেফারেন্স পেতে পারে, তবে এটি আপনাকে আপনার ব্যবস্থাপনিত অবজেক্ট প্রসঙ্গে যেমন ইউআইএপ্লিকেশন এর সাবক্লাস দ্বারা যুক্ত কোনও পদ্ধতি বা ভেরিয়েবল অ্যাক্সেস করতে দেয় না। এটি সমাধানের জন্য, কেবলমাত্র "অ্যাপডেলিগেট" এ ডাউনকাস্ট করুন বা আপনার ইউআইএপ্লিকেশন সাবক্লাসটি যা ডাকা হবে তা কখনও বলা যায় না। ইন সুইফট 3, 4 ও 5 , এই নিম্নরূপ সম্পন্ন করা হয়:

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

10
যদি কারও এখনও সমস্যা হয় তবে ওএস এক্সকে টার্গেট করে আপনার এনএসএপ্লিকেশন.শ্রেড অ্যাপ্লিকেশন () এর জন্য কাজ করার জন্য কোকো আমদানি করা প্রয়োজন। আমি অনুমান করতে পারি যে আইওএস এর সমতুল্য প্রয়োজন হবে।
স্মুরাইস

2
এটি দুটি উত্তর আরও কার্যকর।
জো

3
@ জাজজর্ডান এই পদ্ধতিটি ব্যবহার করে আপনি সম্পত্তির জন্য স্বয়ংক্রিয়তা অর্জন করবেন তবে বাস্তবে এটি কার্যকর হবে না। আপনি যখনই এটি ব্যবহার করবেন তখন এইভাবে অ্যাপডেলিগেট শ্রেণীর একটি নতুন উদাহরণ তৈরি হবে। শেয়ারড অ্যাপ্লিকেশন সিঙ্গলটনের মাধ্যমে আপনি ডেলিগেটকে অ্যাক্সেসযোগ্য ব্যবহার করা ভাল। এবং আপনার দ্বিতীয় প্রশ্ন যতদূর যায়, হ্যাঁ আপনি সম্ভবত একটি ধ্রুবক ব্যবহার করতে চান। যদিও আপনি অ্যাপডেলিগেটের বৈশিষ্ট্যগুলি পরিবর্তন করছেন, আপনি সম্ভবত পয়েন্টারটিকে অন্য কোনও কিছুর কাছে পুনর্নির্দিষ্ট করবেন না, সেক্ষেত্রে ভেরিয়েবলের দরকার নেই। যদিও এটি আপনার সম্পূর্ণরূপে। আপনার প্রয়োজন অনুসারে কাজ করুন।
মিক ম্যাককালাম

2
দুর্দান্ত পরামর্শ! আমি ভুল করে ভেবেছিলাম যে অ্যাপডেলিগেট () সিঙ্গলটন ছিল কিন্তু আপনি যা বলেছিলেন তা চিন্তা করার পরে আমি বুঝতে পেরেছি যে যদি এটি হয় তবে আমাদের পক্ষে এইভাবে ব্যবহার করার জন্য একটি ভাগ করে নেওয়া অ্যাপ্লিকেশন প্যাটার্ন থাকবে না। অবশ্যই আমি অপ্রয়োজনীয় দৃষ্টান্তগুলি ছড়িয়ে দিতে চাই না যদি আমার না হয়, তাই আপনার ধ্রুবক ঘোষণাটি পুরোপুরি উপযুক্ত হবে; ধন্যবাদ.
zacjordaan

4
আমি এটিকে পৃথক উত্তর হিসাবে যুক্ত করতে চাই না, তবে আপনার নিজস্ব পদ্ধতি, প্রকল্পের যেখানে একটি সুইফট এবং একটি ওজ-সি উভয় ব্যবহার করা হয়েছে সেই বৈশিষ্ট্যগুলির সাথে অ্যাপডেলিগেট পেতে আপনার # ইম্পোর্ট "AppDelegate.h" "" প্রকল্পের নাম-ব্রিজিংহাইডার যুক্ত করতে হবে should ।
এইচ

44

সুইফট 4.2

সুইফটে, আপনার ভিসিগুলিতে অ্যাক্সেস করা সহজ

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

25

সুবিধাযুক্ত নির্মাণকারী

কোড শেষে অ্যাপডেলিগেট ক্লাসে যুক্ত করুন

সুইফট 5

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

আপনার শ্রেণিতে AppDelegate রেফারেন্স ব্যবহার করতে?


AppDelegate পদ্ধতি কল করুন

appDelegate ()। setRoot ()


সেটরুট () কী করে এবং কখন এটি কল করবে তা বোঝাতে দুর্দান্ত হবে। উদাহরণস্বরূপ, ভিউকন্ট্রোলার থেকে এটি কল করা ঠিক আছে? ইউনিট পরীক্ষা থেকে উইন্ডো এখনও সেট করা হয়নি? আরও প্রসঙ্গ মহান হবে।
Houman

@ হিউম্যান সেটরুট অ্যাপডেলিগেটের পদ্ধতি যা একাধিক রুট বা প্যারেন্টভিউ কনট্রোলারের মধ্যে স্যুইচ করতে ব্যবহৃত হতে পারে এবং যে কোনও পদ্ধতি হতে পারে। আরও অ্যাক্সেসের জন্য অ্যাপডেলিগেটের রেফারেন্স কীভাবে পাওয়া যায় সে সম্পর্কে আলোচনা, তবে আশা করা যায় সেটরুটটিও অবশ্যই পরিষ্কার হবে।
আইআইওএসএন

19

এটি উদ্দেশ্য-সি-এর মতো প্রায় একই রকম

let del = UIApplication.sharedApplication().delegate

19

এটি ওএস এক্সের জন্য ব্যবহার করা যেতে পারে

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

এখানে সুইফট ২.০ সংস্করণ রয়েছে:

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 Class এ একটি পদ্ধতি তৈরি করুন

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
এটিও কাজ করে এবং আমি শেয়ারডআইনস্ট্যান্স নামকরণের ধারণাটি পছন্দ করি। ধন্যবাদ!
জন গ্রিফিথস

2
আপনার উদাহরণটি AppDelegateপ্রতিবার আপনি যখনই ডেকে একটি নতুন অবজেক্টটি AppDelegate().sharedInstance()
তত্ক্ষণাতিত

1
আমি এই সমাধানটি গ্রহণযোগ্যর চেয়ে ভাল পছন্দ করি (এটি যদি আপনি সম্পূর্ণরূপে ব্যবহার করতে হয় তবে "অপ্রচলিত" ভার্বোস)। আমি একজন নিয়ে পরীক্ষা-নিরীক্ষা সম্পর্কে চিন্তা ছিল extensionজন্য NSApplicationআগে আমি এই উত্তর পাওয়া গিয়েছিলো, কিন্তু এই অনেক উত্তম। আজকাল আপনি সম্ভবত একটি ক্লাস গণিত পঠন সম্পত্তি ব্যবহার করতে চান sharedযদিও, সম্ভবত আপনি সুইফট 3 জন্য একটি আপডেট পোস্ট করতে চান?
পাত্রু

1
আমি আসলে আমার কোডটি ব্যবহারের জন্য পুনরায় ব্যবহারের প্রক্রিয়াধীন static var shared : TournamentDelegate? { get { return NSApplication.shared().delegate as? TournamentDelegate } }যা এই ধরণের জিনিসের জন্য গণিত পঠনযোগ্য বৈশিষ্ট্যগুলি ব্যবহার করার বিকাশমান সুইফট 3 স্টাইলের সাথে আরও বেশি মিল রয়েছে। ?একবার রিফ্যাক্টরিং হয়ে গেলে আমি সম্ভবত ফেলে দিতে সক্ষম হব , আপনি কি ভাবেন না? (দুঃখিত, মন্তব্যে কোড ফর্ম্যাটিং সর্বদা একটি
গোলযোগ

@ পিএক্সপ্লেগ্রাফিক্স ইউআইএপ্লিকেশন একটি সিঙ্গলটন ক্লাস তাই একাধিক তাত্পর্য সম্পর্কে চিন্তা করার দরকার নেই।
অভিজিৎ


6

এটি সহজভাবে চেষ্টা করুন:

সুইফট 4

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

আপনার অ্যাপ্লিকেশনটিতে কোথায়:

// 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'?। এটা কি পুরানো?
pkamb

@ পেক্যামব আমি একটি নতুন প্রকল্পে এটি চেষ্টা করেছি এবং আমার এই ত্রুটি নেই। আমি UIApplicationDelegateদ্বারা NSApplicationDelegateএবং UIApplicationদ্বারা প্রতিস্থাপিত NSApplication
nyg


4

এটা খুব সহজ

অ্যাপ প্রতিনিধি উদাহরণ

let app = UIApplication.shared.delegate as! AppDelegate

আপনি এক লাইনের সিনট্যাক্স সহ কোনও পদ্ধতিতে কল করতে পারেন

app.callingMethod()

আপনি এই কোড সহ একটি পরিবর্তনশীল অ্যাক্সেস করতে পারেন

app.yourVariable = "Assigning a value"

2

আমার ক্ষেত্রে, আমি import UIKitআমার NSManagedObjectসাবক্লাসের শীর্ষে অনুপস্থিত ছিল । এটিকে আমদানি করার পরে, আমি সেই ত্রুটিটি সরিয়ে দিতে পারতাম UIApplicationএর অংশ হিসাবেUIKit

আশা করি এটি অন্যকে সহায়তা করবে !!!


2

আমি এটি সুইফট ২.৩ এ ব্যবহার করি।

1. ইন অ্যাপডেলিগেট ক্লাস

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

2. কল অ্যাপ্লিকেশন সহ

let appDelegate = AppDelegate.sharedInstance

2
extension AppDelegate {

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

2

আইওএস 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 এ আপনার কোডটি "ইউআইএআইপ্লিকেশন। ডেলেগেটটি কেবল মূল থ্রেড থেকে ব্যবহার করতে হবে" সতর্কতা দেবে। আপনি উত্তর আপডেট করতে পারেন?
মহেশ নারলা

এটি fatalErrorকার্যত আন-মোড়ানো শক্তির সমতুল্য!
pkamb

1

সুইফট ৩.০ এ আপনি appdelegateরেফারেন্সটি পেতে পারেন

let appDelegate = UIApplication.shared.delegate as! AppDelegate

0

এক্সকোড 6.2 এ এটিও কাজ করে

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

let aVariable = appDelegate.someVariable

2
v01d, কোথা থেকে আপনি এটি নিয়েছেন?
এনএসপ্র্যাটিক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.