iOS - ViewController'dan App Delegate yöntemini çağırma


248

Ne yapmaya çalışıyorum (bir kod oluşturulan) bir düğmeye tıklayın ve farklı bir görünüm denetleyicisi çağırmak sonra yeni görünüm denetleyicisi bir işlevi çalıştırmak var.

IB'de nispeten kolayca yapılabileceğini biliyorum, ancak bu bir seçenek değil.

Ne yapmak istediğime bir örnek, evin bir açılış ekranı olan iki görünüm denetleyiciniz varsa olurdu. Diğer görünüm denetleyicisi, tüm odalar üzerinden belirlenmiş bir sırayla geçebilir üzerinde evin bir yürüyüş vardı. Açılış ekranı, her oda için, yürürken herhangi bir noktaya atlamanızı sağlayacak düğmelere sahip olacaktır.

Yanıtlar:


538

Temsilciye şu şekilde erişebilirsiniz:

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

MainClass'ı uygulama sınıfınızın adıyla değiştirin .

Ardından, diğer görünüm denetleyicisi için bir özelliğiniz varsa, şunun gibi bir şey arayabilirsiniz:

[appDelegate.viewController someMethod];

12
Ayrıca, kullanılan her yerde appDelegate.h dosyasını içe aktarmanız gerekebilir veya @class appDelegate
German

3
appDelegate.h dosyası, hedefin önek / önceden derlenmiş başlık dosyası IMO'suna gitmek için iyi bir adaydır.
mharper

48
Mharper'ın belirttiği gibi uygulama temsilcinizi Prefix.pch dosyasına aktarırsanız, bunu aynı zamanda ekleyebileceğinizi de söyler: #define AppDelegate ((MyAppDelegateClass *) [UIApplication sharedApplication] .delegate). '[AppDelegate.viewController someMethod]'. Biraz basitleştirir, ancak kötüye kullanmayı da kolaylaştırır.
Kenny Lövrin

@ delegate.h dosyamın @ sonundan sonra #define AppDelegate ((MyAppDelegateClass *) [UIApplication sharedApplication] .delegate) ekledikten sonra hangi sınıf içe aktarma uygulaması temsilcisi doğrudan [AppDelegate.viewController someMethod]
harveyslash

43

Ve eğer kimse bunu nasıl yapacağını merak ederse swift:

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

eğer appDelegate = UIApplication.sharedApplication (). delege olarak? AppDelegate {} hızlı bir şekilde daha iyi bir yaklaşımdır.
cbartel

@petrsyn Delege ne demek istiyorsun nil? Bu DAİMA bir uygulamanın bir AppDelegate'i yok mu ?!
Bal

Swift'in son sürümlerinde, sharedApplication()ile değiştirilmelidir shared. yani, "Uygulama" yı ve parantezleri kaldırın. Swift if let myDelegate = UIApplication.shared.delegate as? AppDelegate { myDelegate.someMethod() }
5.2'den

41

Kulağa sadece UINavigationController düzene mi ?

Sen alabilirsiniz AppDelegateprogramda hiçbir yerinde yoluyla

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

Uygulama temsilcinizde, IB aracılığıyla veya kodla gezinme denetleyicinizin kurulumunu yapmış olmanız gerekir.

Kodda, 'Ev genel görünümü' görünüm denetleyicinizi oluşturduğunuzu varsayarak, bu tür bir şey olabilir 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];

Bundan sonra, 'oda' başına bir görünüm denetleyicisine ihtiyacınız vardır ve bir düğme tıklama olayı alındığında aşağıdakileri çağırırsınız ...

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

Yukarıdaki kodu test etmedim, bu yüzden herhangi bir sözdizimi hatasını affedin, ancak sahte kodun yardımcı olduğunu umuyoruz ...


8
Cevabınız da doğru, Cristian'in ve cevabınızın bir kombinasyonunu kullandım. Keşke onay işaretini ayırabilseydim.
Mytheral

15

Ben böyle yaparım.

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

İçe aktarmayı unutmayın.

#import "AppDelegate.h"

13

Sadece şu adımları izleyin

1. uygulama temsilcinizi, sınıfınıza uygulama temsilcisi nesnesini istediğiniz yere aktarın.

#import "YourAppDelegate.h"

2. sınıfınızda uygulama delege nesnenizin bir örneğini oluşturun (temel olarak tek bir ton).

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

3. şimdi seçici kullanarak yöntemi çağırmak

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

        [appDelegate yourMethod];
    }

veya doğrudan

[appDelegate yourMethod];

hızlı için

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

ilk tavsiye eder. Koş ve git.


bu özellikle temsilcinin yeni bir örneği DEĞİLDİR, daha ziyade singleton uygulamasının singleton delegesini alır
Ammo Goettsch

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

AppDelegate.h'nizi her yere eklemek zorunda kalmazsınız. Uzun bir yol kat eden, bağımsız Kontrolör geliştirmeye ve sınıf adı hakkında endişelenmeden bunları başka bir yerde yeniden kullanmanıza izin veren basit bir oyuncu ...

Zevk almak


Paylaştığınız için teşekkür ederim, birkaç dakika beni mutlu ediyor, muhtemelen bir şekilde işe yarayacak, ama visibleViewController gibi bir yöntem kullanmak istersem ne olur? Bunun gibi bir hata verir: 'NSObject <UIApplicationDelegate> * türündeki nesnede' visibleViewController 'özelliği bulunamadı. bunun için bir çözüm var mı?
mgyky

8

Birçok iyi yanıt zaten eklenmiştir. Yine de çoğu zaman bana uygun bir şey eklemek istiyorum.

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

ve bu kadar. Uygulama boyunca sabit gibi kullanın.

Örneğin

[kAppDelegate methodName];

AppDelegate.h dosyanızı karşılık gelen .pch veya makro dosyalarına aktarmayı unutmayın.


7

Xamarin'de (Xamarin.ios / Monotouch) birisinin aynı ihtiyacı varsa, bu benim için çalıştı:

var myDelegate = UIApplication.SharedApplication.Delegate as AppDelegate;

(UIKit kullanılmasını gerektirir;)


Swift'teki doğru ifade appdel olsun: AppDelegate = UIApplication.shared.delegate as! AppDelegate
Phil

5

WatchOS'taki bir görünüm denetleyicisinden WatchKit uzantı temsilcinize erişmeniz gerekirse:

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

5

Swift 3.0 ve üstü için güncelleme

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

    print("someMethodInAppDelegate called")
}

aşağıdaki yöntemi kullanarak kontrolörünüzden yukarıdaki yöntemi çağırmak

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

    appDelegate.someMethodInAppDelegate()
}

Çıktı:

resim açıklamasını buraya girin


3

#define uAppDelegate (AppDelegate *)[[UIApplication sharedApplication] delegate]Projenizin Prefix.pchdosyasını ekleyebilir ve aşağıdaki kod ile istediğiniz AppDelegateherhangi bir yöntemi çağırabilirsiniz UIViewController.

[uAppDelegate showLoginView];

0

Teknik olarak mümkün olsa bile, iyi bir yaklaşım DEĞİLDİR. Şöyle dediğinde: "Açılış ekranında, her oda için yürürken herhangi bir noktaya atlamana izin veren düğmeler bulunur." Yani düğmelerdeki tohc olayları aracılığıyla bu denetleyicileri çağırmak için appdelegate'ten geçmek mi istiyorsunuz?

Bu yaklaşım Apple yönergelerine uymaz ve birçok dezavantajı vardır.


Sorunun tarihine bakın ... Arayüz Oluşturucu ayrı bir uygulama ve geliştirme çok farklı bir canavar olduğunda arkadan. Yıllardır iOS geliştirmesine dokunmadım, bu yüzden daha modern cevapları değerlendiremiyorum.
Mytheral

bu olabilir .. ama benim düşüncelerim hala geçerlidir
ingconti

0

2020'de iOS13, xCode 11.3. Objective-C için çalışan:

#import "AppDelegate.h"

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

Benim için çalışıyor, umarım sana da aynısını yapar! : D

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.