2012-02-10 12 views
10

Czy można poprawnie używać AppDelegate jako zmiennej instancji w UIViewController? Jak @property (nonatomic, weak) AppDelegate *appDelegate;iOS - zmienna AppDelegate jako instancja?

Dlaczego pytam dlatego, że muszę do niego dostęp dość często więc zamiast robić:

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

[appDelegate doSomething]; 

mogłem zrobić:

[appDelegate doSomething]

+2

Jeśli korzystasz z niego tak często, dlaczego nie przenieść tej pracy w inne miejsce? – Osiris

Odpowiedz

12

Albo można zrobić

-(YourAppDelegate*) app 
{ 
    return (YourAppDelegate*) [[UIApplication sharedApplication] delegate]; 
} 

W podklasie UIViewController - wtedy zrobić, że baza-klasa wszystkich kontrolerów widoku.

Wtedy, [self app] działa i nie trzeba zachować odniesienia.

Robię to, aby zachować pewne typowe proste narzędzia - możesz to również zrobić z kategorią.

4

rozróżnienie między uzyskiwania dostępu do delegowanie przez pełne wyrażenie w stosunku do właściwości (nieatomowej, słabej) jest arbitralne. Oczywiście, zapisz sobie linie kodu, definiując właściwość, jeśli zamierzasz ją często wywoływać.

Pytanie to jednak rodzi większe pytanie o problem z enkapsulacją. Najlepsza praktyka sugeruje, że połączenia przechodzą w dół hierarchii w górę. Oczywiście delegat aplikacji jest trochę szczególnym przypadkiem, ale moja rada to rozważenie możliwych sposobów wyizolowania dowolnego zasobu, którego potrzebujesz, od delegata aplikacji i przekazanie tych odniesień do hierarchii kontrolerów widoku, ponieważ ta hierarchia jest stworzony.

16

Może to być w porządku.

Ale moje ulubione rozwiązanie jest następujące.

w twojej AppDelegate.h

+ (AppDelegate *)appDelegate; 

W swojej AppDelegate.m

+ (AppDelegate *)appDelegate 
{ 
    return (AppDelegate *)[[UIApplication sharedApplication] delegate]; 
} 

Następnie użyj gdziekolwiek chcesz:

AppDelegate* sharedDelegate = [AppDelegate appDelegate]; 

Kilka uwag:

jeśli używasz AppDelegate dla wspólnych danych, możesz przeczytać singletons-appdelegates-and-top-level.html.

jeśli używasz AppDelegate do logicznego przepływu pracy aplikacji można przeczytać handling-your-initial-view-controllers-for-iphone/

Nadzieję, że to pomaga.

+0

'getAppDelegate' narusza wytyczne firmy Apple dotyczące [nazewnictwa] (http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CodingGuidelines/Articles/NamingMethods.html#//apple_ref/doc/uid/20001282- BCIGIJJF).Lepszą nazwą byłoby '+ (AppDelegate *) appDelegate;' lub '+ (AppDelegate *) sharedAppDelegate;' –

+0

@AlexPretzlav dzięki za twoją edycję. –