AppDelegate örnek değişkenlerine başvurma


84

Gezinme Tabanlı Uygulama şablonuna dayalı bir projem var. AppDelegate'de yöntemler -applicationDidFinishLoading:ve -applicationWillTerminate:. Bu yöntemlerde, uygulama verilerini yükleyip kaydediyorum ve bir örnek değişkeninde depoluyorum (aslında bir nesne grafiği).

Uygulama yüklendiğinde, bir NavigasyonConroller'a sahip olan MainWindow.xib'i yükler ve bu da RootViewController'a sahiptir. RootViewController nibNameözelliği RootView'a (gerçek denetleyici sınıfım) işaret eder.

Sınıfımda, -applicationDidFinishLoading:yöntemde oluşturduğum nesneye başvurmak istiyorum , böylece ona bir referans alabileyim.

Biri bana bunu nasıl yapacağımı söyleyebilir mi? Programla oluşturduğum nesneler arasında nasıl referans vereceğimi biliyorum, ancak orta adımın NIB dosyası içinden yapıldığı göz önüne alındığında, geri dönüş yolumu çözemiyorum.

Yanıtlar:


204

Uygulamanın herhangi bir yerinde erişmem gereken değişkenler (genellikle model veri yapısı) için bunları AppDelegate sınıfınızda bildirin. Başvurmanız gerektiğinde:

YourAppDelegate *appDelegate = (YourAppDelegate *)[[UIApplication sharedApplication] delegate];
//and then access the variable by appDelegate.variable 

7
Buna oy verdim çünkü oyuncu kadrosunu eklediniz, AppDelegate'i kendi türünüze çevirmeniz gerekir, böylece kendi belirlediğiniz mülklerinizi görebilirsiniz. Ancak "AppDelegate" e yayın yapmayarak bunu daha net hale getirmek için düzenleme yapabilirsiniz ...
Kendall Helmstetter Gelner

Uygulama temsilcisi adına veya üyelerinden herhangi birine başvurmadan kök görünüm denetleyicisine erişmenin bir yolu var mı? (Kök görünüm denetleyicisine ihtiyaç duyan bir taşınabilir kod yazmak istiyorum.)
SK9

SK9, her iOS uygulamasının bir appDelegate'e sahip olması gerekir, böylece kod taşınabilir olacaktır!
Daniel

16

Sorunuzu anlarsam, AppDelegate nesnenizdeki üye değişkenlerine / özelliklerine başvurmak ister misiniz? En basit yol, nesnenize bir başvuru döndürmek için [[UIApplication sharedApplication] temsilcisini] kullanmaktır.

Pencere adında bir mülkünüz varsa, bunu yapabilirsiniz:

UIWindow   *mainWindow = [[[UIApplication sharedApplication] delegate] window];
//do something with mainWindow

11

İşte iOS4.0 ve üstü için iyi tanımlanmış bir taşınabilir alternatif:

UIApplication *myApplication = [UIApplication sharedApplication];
UIWindow *mainWindow = [myApplication keyWindow];
UIViewController *rootViewController = [mainWindow rootViewController];

veya tek satırda

UIViewController *rootViewController = [[[UIApplication sharedApplication] keyWindow] rootViewController];

Pencerenin rootViewControllerözelliğini (IB'de söyleyin) ayarlamayı unutmayın, yoksa bu jack yapar.


2

Bir makro tanımlayın ve onu her yerde kullanın!

#define appDelegateShared ((AppDelegate *)[UIApplication sharedApplication].delegate)

Kodumda: -

UIViewController *rootViewController = appDelegateShared.window.rootViewController;
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.