При использовании [[UIApplication sharedApplication] делегат] - PullRequest
13 голосов
/ 25 ноября 2010

Я не знаю, когда и почему я должен использовать [[UIApplication sharedApplication] delegate]

Я использую делегат, когда [self.navigationController pushViewController:myView Animation:YES] не перемещается. Я делаю MyView *delegate = [[UIApplication sharedApplication] delegate] и [delegate pushViewController:myView Animation:YES], чтобы навигация работала правильно.

Я не знаю, является ли решение правильным, и, кроме того, я не знаю, каково значение [[UIApplication sharedApplication] delegate] или как оно влияет на приложение.

Может ли кто-нибудь мне помочь?

Спасибо !!

Ответы [ 2 ]

22 голосов
/ 25 ноября 2010

[[UIApplication sharedApplication] delegate] даст вам указатель на вашего делегата приложения. тот, который был автоматически создан, когда вы сделали проект. Обычно он называется YourAppNameAppDelegate.

две вещи немного не так с вашим кодом.

  1. при объявлении MyView *delegate это должно быть id delegate или YourAppNameAppDelegate *delegate.

  2. Вы не должны получать доступ к своему навигационному контроллеру через делегат приложения. Я хотел бы выяснить, почему self.navigationController терпит неудачу, и обратиться к этому. В основном вы реализуете шаблон синглтона, когда полагаетесь на делегата приложения. Поскольку шаблон синглтона является наименее классным шаблоном проектирования программирования, он не принесет вам никакой выгоды, если вы будете общаться с другими программистами в магазине.

5 голосов
/ 25 ноября 2010
self.appDelegate = [[UIApplication sharedApplication] delegate];

Когда вы создаете переменную с именем appDelegate в ваших IVars, она не просто будет автоматически установлена ​​делегату приложения - вы должны установить ее самостоятельно.Из любого места в вашем приложении вы можете получить доступ к делегату по одноэлементному приложению.

[UIApplication sharedApplication] <--- дает доступ к одноэлементному методу делегата </p>

, который возвращает указатель на делегата приложения.

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

...