iOS - कॉलिंग ऐप प्रतिनिधि विधि ViewController से


248

मैं जो करने की कोशिश कर रहा हूं वह एक बटन पर क्लिक करना है (जो कोड में बनाया गया था) और उसके पास एक अलग दृश्य नियंत्रक है और फिर उसने नए दृश्य नियंत्रक में एक फ़ंक्शन चलाया है।

मुझे पता है कि यह आईबी में अपेक्षाकृत आसानी से किया जा सकता है लेकिन यह एक विकल्प नहीं है।

एक उदाहरण जो मैं करना चाहता हूं वह यह होगा कि यदि आपके पास घर की स्प्लैश स्क्रीन के साथ दो व्यू कंट्रोलर हैं। दूसरे व्यू कंट्रोलर के पास इस पर घर के माध्यम से एक चलना था कि आप एक निर्धारित क्रम में सभी कमरों के माध्यम से जा सकते हैं। स्प्लैश स्क्रीन में प्रत्येक कमरे के लिए बटन होते हैं जो आपको वॉक के माध्यम से किसी भी बिंदु पर कूदने की अनुमति देगा।

जवाबों:


538

आप प्रतिनिधि को इस तरह एक्सेस कर सकते हैं:

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

अपने आवेदन वर्ग के नाम के साथ मेनक्लास बदलें ।

फिर, बशर्ते आपके पास अन्य दृश्य नियंत्रक के लिए एक संपत्ति हो, आप कुछ इस तरह से कॉल कर सकते हैं:

[appDelegate.viewController someMethod];

12
जहां भी इसका इस्तेमाल किया जाता है, वहां appDelegate.h फ़ाइल आयात करने की आवश्यकता हो सकती है, या @class appDelegate
Zaky जर्मन

3
appDelegate.h फ़ाइल लक्ष्य के उपसर्ग / पूर्वनिर्धारित हेडर फ़ाइल IMO में जाने के लिए एक अच्छा उम्मीदवार है।
mharper

48
यदि आप अपने ऐप प्रतिनिधि को अपने Prefix.pch में आयात करते हैं, जैसे @mperper कहता है कि आप इसे उसी समय भी जोड़ सकते हैं: #define AppDelegate (MyAppDelegateClass *) [UIApplication साझाकरण] .delegate] जो तब आपको अपने ऐप प्रतिनिधि की तरह पहुंचने की अनुमति देता है। '[AppDelegate.viewController someMethod]'। यह इसे थोड़ा सरल करता है, लेकिन यह इसका दुरुपयोग करना भी आसान बनाता है।
केनी लोवरिन

मेरे ऐप डेलीगेट.ह फ़ाइल के @end के बाद, मैंने #define AppDelegate ((MyAppDelegateClass *) [UIApplication sharedApplication] .delegate) को जोड़ा है। अब जो भी क्लास इम्पोर्ट डेलिगेट करेगा वह सीधे [AppDelegate.viewController someMethod] का उपयोग कर सकता है
harveyslash

43

और अगर कोई सोच रहा है कि यह कैसे करना है swift:

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

यदि appDelegate = UIApplication.saredApplication ()। AppDelegate {} स्विफ्ट में बेहतर दृष्टिकोण है।
cbartel

@petrsyn क्या मतलब है कि प्रतिनिधि हो सकता है nil? नहीं है कि एक app हमेशा एक appDelegate है ?!
हनी

स्विफ्ट के हाल के संस्करणों में, के sharedApplication()साथ प्रतिस्थापित किया जाना चाहिए shared। यानी, "एप्लिकेशन" और कोष्ठक हटा दें। तो स्विफ्ट 5.2 के रूप में पूर्ण कार्य कोड होगा: if let myDelegate = UIApplication.shared.delegate as? AppDelegate { myDelegate.someMethod() }
sfarbota

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"

2. अपनी कक्षा में अपने एप्लिकेशन प्रतिनिधि ऑब्जेक्ट (इसका मूल रूप से एक सिंगलटन) का एक उदाहरण बनाएं।

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

3. अब चयन विधि का उपयोग कर आह्वान विधि

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 को शामिल करने से बचें। यह एक सरल कास्ट है जो एक लंबा रास्ता तय करता है, स्वतंत्र नियंत्रक को विकसित करने और उन्हें कहीं और फिर से उपयोग करने की अनुमति देता है बिना वर्ग के नाम और इतने पर चिंता करने की ...

का आनंद लें


साझा करने के लिए धन्यवाद, यह मुझे कुछ मिनटों के लिए खुश करता है, प्रोबॉयली यह किसी तरह से काम करेगा, लेकिन क्या होगा अगर मैं इसे से दृश्यदर्शीकंट्रोलर जैसी विधि का उपयोग करना चाहता हूं? यह इस तरह से त्रुटि देगा: संपत्ति 'दृश्यदर्शीकंट्रोलर' प्रकार की वस्तु पर नहीं मिली 'NSObject <UIApplicationDelegate> *। इसके लिए कोई समाधान?
mgyky

8

बहुत सारे अच्छे उत्तर पहले ही जोड़ दिए गए हैं। हालांकि मैं कुछ ऐसा जोड़ना चाहता हूं जो मुझे सबसे ज्यादा सूट करे।

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

और बस। एक निरंतर की तरह आवेदन भर में इसका इस्तेमाल करते हैं।

जैसे

[kAppDelegate methodName];

.Pch या macros फ़ाइल में अपनेAppDelegate.h आयात करना न भूलें।


7

अगर किसी को Xamarin (Xamarin.ios / Monotouch) में समान चाहिए, तो यह मेरे लिए काम करता है:

var myDelegate = UIApplication.SharedApplication.Delegate as AppDelegate;

(UIKit का उपयोग करने की आवश्यकता है;)


स्विफ्ट में सही कथन है appdel: AppDelegate = UIApplication.sared.delegate as! AppDelegate
फिल

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

भले ही तकनीकी रूप से संभव हो, एक अच्छा तरीका नहीं है। जब आप कहते हैं: "स्प्लैश स्क्रीन में प्रत्येक कमरे के लिए बटन होते हैं जो आपको वॉक के माध्यम से किसी भी बिंदु पर कूदने की अनुमति देगा।" तो आप बटन पर tohc घटनाओं के माध्यम से इन नियंत्रकों को कॉल करने के लिए appdelegate से गुजरना चाहते हैं?

यह दृष्टिकोण Apple दिशानिर्देशों का पालन नहीं करता है और इसमें बहुत सारी कमियां हैं।


प्रश्न पर तारीख को देखें ... यह तब से है जब इंटरफ़ेस बिल्डर एक अलग अनुप्रयोग था और विकास एक बहुत अलग जानवर था। मैंने वर्षों में iOS के विकास को नहीं छुआ है इसलिए मैं अधिक आधुनिक उत्तरों का मूल्यांकन नहीं कर सकता।
मायथेरल


0

2020 में, iOS13, xCode 11.3। उद्देश्य-सी के लिए क्या काम कर रहा है:

#import "AppDelegate.h"

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

यह मेरे लिए काम कर रहा है, मुझे आपसे यही उम्मीद है! : डी

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