আইওএস - ভিউকন্ট্রোলার থেকে অ্যাপ ডেলিগেট পদ্ধতি কল করা


248

আমি যা করার চেষ্টা করছি তা হ'ল একটি বোতামটি ক্লিক করুন (যা কোডে তৈরি হয়েছিল) এবং এটিতে একটি ভিন্ন ভিউ কন্ট্রোলার কল করতে হবে তবে এটি নতুন ভিউ নিয়ন্ত্রকের কোনও ফাংশন চালাবে।

আমি জানি এটি আইবিতে তুলনামূলকভাবে সহজেই করা যেতে পারে তবে এটি কোনও বিকল্প নয়।

আমি কী করতে চাই তার একটি উদাহরণ হ'ল যদি আপনার বাড়ির স্প্ল্যাশ স্ক্রিন সহ দু'জন ভিউ কন্ট্রোলার থাকে। অন্য ভিউ কন্ট্রোলারটির উপর দিয়ে বাড়ির বাইরে হাঁটা ছিল যা আপনি একটি সেট ক্রমে সমস্ত কক্ষটি দিয়ে যেতে পারেন। স্প্ল্যাশ স্ক্রিনে প্রতিটি ঘরের জন্য বোতাম থাকবে যা আপনাকে হাঁটার পথে যে কোনও বিন্দুতে লাফিয়ে উঠতে দেয়।

উত্তর:


538

আপনি এইভাবে প্রতিনিধি অ্যাক্সেস করতে পারেন:

MainClass *appDelegate = (MainClass *)[[UIApplication sharedApplication] delegate];

আপনার অ্যাপ্লিকেশন শ্রেণির নামের সাথে মেইনক্লাসটি প্রতিস্থাপন করুন ।

তারপরে, অন্য ভিউ কন্ট্রোলারের জন্য যদি আপনার কোনও সম্পত্তি থাকে তবে আপনি এমন কিছু কল করতে পারেন:

[appDelegate.viewController someMethod];

12
অ্যাপডেলিগেট.এইচ ফাইলটি যেখানেই ব্যবহার করা হোক না কেন আমদানি করতে পারে, বা ক্লাস অ্যাপডেলিগেট করতে হবে
জাকি জার্মান

3
appDelegate.h ফাইলটি লক্ষ্যটির উপসর্গ / প্রাকম্পম্পাইল্ড শিরোনাম ফাইল আইএমওতে যাওয়ার জন্য একটি ভাল প্রার্থী।
'21

48
আপনি যদি আপনার প্রিফিক্স.পিতে আপনার অ্যাপের প্রতিনিধিকে আমদানি করেন তবে @ এমহার্পির মতো আপনিও একই সময়ে এটি যোগ করতে পারেন: # ডিফাইন অ্যাপডেলিগেট ((মাইএপিডেলিগেট ক্লাস *) [ইউআইএপ্লিকেশন শেয়ারড অ্যাপ্লিকেশন]। ডেলিগেট) যা আপনাকে আপনার অ্যাপের প্রতিনিধিদের মতো অ্যাক্সেস করতে দেয় '[AppDelegate.viewController someMethod]'। এটি এটিকে কিছুটা সরল করে তোলে তবে এটির অপব্যবহারও সহজ করে তোলে।
কেনি লভরিন

আমার অ্যাপের ডেলিগেট.এইচ ফাইলের @end পরে, আমি # ডিফাইন অ্যাপডেলিগেট যুক্ত করেছি ((মাইএপিডেলিগেটক্লাস *) [ইউআইএপ্লিকেশন শেয়ারড অ্যাপ্লিকেশন]। ডেলিগেট) এখন যে কোনও শ্রেণীর আমদানি করা অ্যাপের প্রতিনিধি সরাসরি [অ্যাপডেলিগেট.ভিউ কনট্রোলার সামথ্র]] ব্যবহার করতে পারবেন
হার্ভিশ্ল্যাশ

42

এবং যদি কেউ ভাবছেন যে এটি কীভাবে এটি করতে হয় swift:

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

যদি অ্যাপডেলিগেট = ইউআইএপ্লিকেশন.শার্ড অ্যাপ্লিকেশন ()। অ্যাপডেলিগেট {ift দ্রুতগতিতে আরও ভাল পদ্ধতির।
সিবারটেল

@ পিটারসিন আপনি কী বোঝাতে চান প্রতিনিধি হতে পারে nil? সবসময়ই কি কোনও অ্যাপ্লিকেশনটির অ্যাপ্লিকেশন নেই ?!
মধু

সুইফটের সাম্প্রতিক সংস্করণগুলিতে এর sharedApplication()সাথে প্রতিস্থাপন করা উচিত shared। যেমন, "অ্যাপ্লিকেশন" এবং প্রথম বন্ধনী মুছে ফেলুন। সুতরাং সুইফট 5.2 হিসাবে সম্পূর্ণ কার্য কোডটি হবে: if let myDelegate = UIApplication.shared.delegate as? AppDelegate { myDelegate.someMethod() }
স্পারবোটা

41

আপনার কি মনে হচ্ছে ঠিক একটি UINavigationControllerসেটআপ দরকার ?

এর মাধ্যমে আপনি AppDelegateপ্রোগ্রামের যে কোনও জায়গা পেতে পারেন

YourAppDelegateName* blah = (YourAppDelegateName*)[[UIApplication sharedApplication]delegate];

আপনার অ্যাপের প্রতিনিধিতে আপনার নেভিগেশন নিয়ন্ত্রক সেটআপ হওয়া উচিত, আইবি বা কোডের মাধ্যমে।

কোডে, ধরে নিয়ে আপনি ইতিমধ্যে আপনার 'ঘর ওভারভিউ' ভিউ কন্ট্রোলার তৈরি করেছেন এটি আপনার মধ্যে এমন কিছু হবে AppDelegate didFinishLaunchingWithOptions...

self.m_window = [[[UIWindow alloc]initWithFrame:[[UIScreen mainScreen]bounds] autorelease];
self.m_navigationController = [[[UINavigationController alloc]initWithRootViewController:homeViewController]autorelease];
[m_window addSubview:self.m_navigationController.view];

এর পরে আপনার কেবল 'রুম' প্রতি একজন ভিউ কন্ট্রোলারের প্রয়োজন এবং যখন একটি বোতাম ক্লিক ইভেন্টটি বাছাই করা হয় তখন নিম্নলিখিতগুলি আহ্বান করুন ...

YourAppDelegateName* blah = (YourAppDelegateName*)[[UIApplication sharedApplication]delegate];
[blah.m_navigationController pushViewController:newRoomViewController animated:YES];

আমি উপরের কোডটি পরীক্ষা করে দেখি নি তাই যেকোন সিনট্যাক্স ত্রুটি ক্ষমা করে তবে আশা করি সিউডো কোডটি সহায়তার ...


8
আপনার উত্তরটিও সঠিক, আমি ক্রিশ্চিয়ানের এবং আপনার উত্তরগুলির সংমিশ্রণটি ব্যবহার করে শেষ করেছি। আমি চাই আমি চেক চিহ্নটি বিভক্ত করতে পারি।
পৌরাণিক

15

এইভাবেই আমি এটি করি।

[[[UIApplication sharedApplication] delegate] performSelector:@selector(nameofMethod)];

আমদানি করতে ভুলবেন না।

#import "AppDelegate.h"

13

এই পদক্ষেপগুলি অনুসরণ করুন

1. আপনার অ্যাপ্লিকেশন প্রতিনিধিটিকে আপনার ক্লাসে ইমপোর্ট করুন যেখানে আপনি অ্যাপের প্রতিনিধি অবজেক্টটি চান।

#import "YourAppDelegate.h"

২. আপনার শ্রেণীর অভ্যন্তরে আপনার অ্যাপের প্রতিনিধি অবজেক্টের (এটি মূলত সিঙ্গলটন) একটি উদাহরণ তৈরি করুন।

YourAppDelegate *appDelegate=( YourAppDelegate* )[UIApplication sharedApplication].delegate;

৩.এবার নির্বাচক ব্যবহার করে পদ্ধতিটি আহবান করুন

if([appDelegate respondsToSelector:@selector(yourMethod)]){

        [appDelegate yourMethod];
    }

বা সরাসরি দ্বারা

[appDelegate yourMethod];

দ্রুত জন্য

let appdel : AppDelegate = UIApplication.shared.delegate as! AppDelegate

আমি প্রথমটি সুপারিশ করব। দৌড়াতে যাও।


এটি বিশেষত ডেলিগেটের কোনও নতুন উদাহরণ নয়, বরং
সিঙ্গলটন

11
NSObject <UIApplicationDelegate> * universalAppDelegate = 
    ( NSObject <UIApplicationDelegate> * ) [ [ UIApplication sharedApplication ] delegate ];

এটি আপনার AppDelegate.h সর্বত্র অন্তর্ভুক্ত করা এড়ানো হবে। এটি একটি সাধারণ castালাই যা অনেক দূর এগিয়ে যায়, স্বতন্ত্র নিয়ামক বিকাশ করতে এবং শ্রেণীর নাম ইত্যাদির বিষয়ে চিন্তা না করে অন্য কোথাও তাদের পুনরায় ব্যবহার করার অনুমতি দেয় ...

উপভোগ করুন


ভাগ করে নেওয়ার জন্য আপনাকে ধন্যবাদ, এটি কয়েক মিনিটের জন্য আমাকে আনন্দিত করে, সম্ভবত এটি কিছুটা কাজ করবে, তবে আমি যদি এর থেকে দৃশ্যমান ভিউ কনট্রোলারের মতো কোনও পদ্ধতি ব্যবহার করতে চাই তবে কী হবে? এটি এর মতো ত্রুটি দেবে: সম্পত্তি 'দৃশ্যমান ভিউ কন্ট্রোলার' 'এনএসবজেক্ট <ইউআইএপ্লিকেশনডেলিগেট> * টাইপের বস্তুতে পাওয়া যায় নি। এর কোন সমাধান?
mgyky

8

ইতিমধ্যে অনেক ভাল উত্তর যুক্ত করা হয়েছে। যদিও আমি এমন কিছু যুক্ত করতে চাই যা আমার বেশিরভাগ ক্ষেত্রে উপযুক্ত।

#define kAppDelegate ((YourAppDelegate *)[[UIApplication sharedApplication] delegate]);

এবং এটাই. ধ্রুবকের মতো এটি অ্যাপ্লিকেশন জুড়ে ব্যবহার করুন।

যেমন

[kAppDelegate methodName];

.Pch বা ম্যাক্রোগুলি ফাইলগুলিতে আপনার অ্যাপ্লিকেশনগি। আমদানি করতে ভুলবেন না।


7

কারও যদি জামারিনে (জ্যামারিন.আইওএস / মনোটোচ) একইর প্রয়োজন হয় তবে এটি আমার পক্ষে কাজ করেছে:

var myDelegate = UIApplication.SharedApplication.Delegate as AppDelegate;

(ইউআইকিট ব্যবহারের প্রয়োজন;)


সুইফ্ট-এ সঠিক বিবৃতিটি অ্যাডডেল করা হবে: অ্যাপডেলিগেট = ইউআইএপ্লিকেশন sha শেয়ারড.ডিলেগেট হিসাবে! অ্যাপডেলেগেট
ফিল

5

এবং আপনার যদি ওয়াচওসিতে কোনও ভিউ কন্ট্রোলারের থেকে আপনার ওয়াচকিট এক্সটেনশন প্রতিনিধিটির অ্যাক্সেসের প্রয়োজন হয়:

extDelegate = WKExtension.sharedExtension().delegate as WKExtensionDelegate?

5

সুইফট 3.0 এবং উচ্চতর জন্য আপডেট

//
// Step 1:- Create a method in AppDelegate.swift
//
func someMethodInAppDelegate() {

    print("someMethodInAppDelegate called")
}

অনুসরণ করে আপনার নিয়ন্ত্রকের কাছ থেকে উপরের পদ্ধতিটি কল করা

//
// Step 2:- Getting a reference to the AppDelegate & calling the require method...
//
if let appDelegate = UIApplication.shared.delegate as? AppDelegate {

    appDelegate.someMethodInAppDelegate()
}

আউটপুট:

এখানে চিত্র বর্ণনা লিখুন


3

আপনি যোগ করতে পারেন #define uAppDelegate (AppDelegate *)[[UIApplication sharedApplication] delegate]আপনার প্রকল্পের এর Prefix.pchফাইল এবং তারপর আপনার কোন পদ্ধতি কল AppDelegateকোনো UIViewControllerকোড নিচে সঙ্গে।

[uAppDelegate showLoginView];

0

এমনকি প্রযুক্তিগতভাবে সম্ভবপর হলেও এটি একটি ভাল পদ্ধতির নয়। আপনি যখন বলবেন: "স্প্ল্যাশ স্ক্রিনে প্রতিটি ঘরের জন্য বোতাম থাকবে যা আপনাকে হাঁটার পথে যে কোনও বিন্দুতে লাফিয়ে উঠতে দেয়" " সুতরাং আপনি বাটনগুলিতে টোএইচসি ইভেন্টের মাধ্যমে এই নিয়ন্ত্রণকারীদের কল করতে অ্যাপেলিগেট দিয়ে যেতে চান?

এই পদ্ধতির অ্যাপল নির্দেশিকাগুলি অনুসরণ করে না এবং এতে প্রচুর ঘাটতি রয়েছে।


প্রশ্নের তারিখটি দেখুন ... এটি ফিরে এসেছে যখন ইন্টারফেস বিল্ডার একটি পৃথক অ্যাপ্লিকেশন ছিল এবং বিকাশ ছিল একেবারে ভিন্ন প্রাণী। আমি কয়েক বছরের মধ্যে আইওএস বিকাশ স্পর্শ করি নি তাই আমি আরও আধুনিক উত্তর মূল্যায়ন করতে পারি না।
পৌরাণিক

এটি সিএ .. তবে আমার বিবেচনাগুলি এখনও বৈধ
ingconti

0

2020 এ, আইওএস 13, এক্সকোড 11.3। উদ্দেশ্য-সি এর জন্য কী কাজ করছে তা হ'ল:

#import "AppDelegate.h"

AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];

এটি আমার পক্ষে কাজ করছে, আমিও আপনার মতো আশা করি! : ডি

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