Если у меня есть класс, в котором я создал протокол (делегатОР) - чтобы назначить делегата для этого протокола, могу ли я сказать, что мне нужно выделить / инициализировать класс «делегата»где-нибудь в файле реализации делегата, а затем назначить его делегатом делегата?
Нет.Обычно он работает так, что какой-то другой класс, обычно какой-то контроллер, будет создавать (например, alloc / init) экземпляр объекта, а также его делегата и устанавливать его делегат.
Например, если выимеют UITableView
и UITableViewDelegate
, обычно у вас есть какой-то контроллер представления, который владеет UITableView
, а также владеет UITableViewDelegate
(часто сам контроллер представления является делегатом).Задача контроллера представления - установить делегата табличного представления.Совершенно очевидно, что UITableView
не является задачей создания и установки его делегата.
Тем не менее, вы правы, что при использовании раскадровки установка делегатов для контроллеров представления может быть сложной.Если метод prepareForSegue:
не работает для вас, я предполагаю, что это потому, что контроллер панели вкладок является вашим корневым контроллером представления (как и должно быть, согласно HIG).Поскольку ваш делегат приложения будет иметь свойство window
, вы сможете получить доступ к корневому контроллеру представления из него:
UITabBarController *tabController = (UITabBarController *)self.window.rootViewController;
tabController.selectedIndex = [defaults integerForKey:kOptionLastTabSelectedKey];
tabController.delegate = self;