iOS - AppDelegate как переменная экземпляра? - PullRequest
10 голосов
/ 10 февраля 2012

Можно ли использовать AppDelegate в качестве переменной экземпляра в UIViewController?Как @property (nonatomic, weak) AppDelegate *appDelegate;

Почему я спрашиваю, потому что мне нужно обращаться к нему довольно часто, вместо того, чтобы делать:

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

[appDelegate doSomething]; 

Я мог бы сделать:

[appDelegate doSomething]

Ответы [ 3 ]

18 голосов
/ 10 февраля 2012

Может быть, все будет в порядке.

Но мое любимое решение заключается в следующем.

В вашем AppDelegate.h

+ (AppDelegate *)appDelegate;

В вашем AppDelegate.m

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

Тогда используйте где хотите:

AppDelegate* sharedDelegate = [AppDelegate appDelegate];

Некоторые примечания:

если вы используете AppDelegate для общих данных, вы можете прочитать singletons-appdelegates-and-top-level.html .

если вы используете AppDelegate для рабочего процесса логического приложения, вы можете прочитать processing-your-initial-view-controllers-for-iphone /

Надеюсь, это поможет.

14 голосов
/ 10 февраля 2012

Или вы могли бы сделать

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

В подклассе UIViewController - тогда сделайте это базовым классом всех ваших контроллеров представления.

Тогда [self app] работает, и вам не нужно хранить ссылку.

Я делаю это, чтобы сохранить некоторые простые простые утилиты - вы также можете сделать это с категорией.

4 голосов
/ 10 февраля 2012

Различие между доступом к делегату по полному выражению и с (неатомным, слабым) свойством является произвольным. Конечно, сохраняйте строки кода, определяя свойство, если вы будете часто его вызывать.

Однако возникает вопрос о возможной проблеме инкапсуляции. Лучшая практика предполагает, что звонки идут вниз по иерархии, а не вверх. Конечно, делегат приложения - это особый случай, но, тем не менее, я бы посоветовал рассмотреть возможные способы выделения того ресурса, который вам нужен, из делегата приложения, и передать эти ссылки вниз по иерархии контроллера представления, поскольку эта иерархия создано.

...