#iphone #objective-c #delegates
#iPhone #objective-c #делегаты
Вопрос:
вот моя навигация в моем приложении
1) контроллер homescreenview -> composemessageviewcontroller (я могу использовать делегирование для отправки данных обратно в homescreenview)
2) контроллер homescreenview -> messageslistcontroller (tableview)-> detailmessageviewcontroller (где находится моя кнопка ответа).
моя проблема в том, что когда я нажимаю «Ответить», я хочу отправить обратно информацию в homescreenviewcontroller с помощью delegate. как я могу это сделать?
Заранее спасибо.
—-ОБНОВИТЬ
@XJones, спасибо за подробное объяснение. это то, что должно быть сделано, когда я нажимаю detailview? пожалуйста, поправьте меня, если я ошибаюсь.
- (недействительно)pushDetailMessageController{ DetailMessagetController *detailmessage = [[Выделение DetailMessagetController] инициализация]; detailmessage.делегировать = self; // вставьте messageListController в навигационный контроллер здесь [подробная версия]; }
Ответ №1:
это очень общий вопрос. вы в основном спрашиваете, как передавать информацию с одного контроллера на другой контроллер. Есть разные способы сделать это, протокол (через который делегат обычно обменивается данными) является одним из них. Самое быстрое, что вы можете сделать, не делая предположений в своем коде, которые могут быть проблематичными позже, — это передать homeScreenController при нажатии messageListController
и затем detailMessageController
. Для этого вам нужно будет определить iVar и свойство в messageListController
и detailMessageController
.
Что-то вроде:
в messageListController.h
:
#import "HomeScreenController.h"
@interface messageListController : UITableViewController {
// your iVars
HomeScreenController *homeScreenController;
@end
@property (nonatomic, assign) HomeScreenController * homeScreenController;
добавьте тот же iVar и свойство для homeScreenController
в detailMessageController
.
в homeScreenController.h
:
- (void)pushMessageListController
{
MessageListController *messageListController = [[MessageListController alloc] init];
messageListController.homeScreenController = self;
// push messageListController onto navigation controller here
[messageListController release];
}
в messageListController
сделайте то же самое, что и выше, при создании и нажатии detailMessageController
. Теперь в detailMessageController
вы можете отправлять сообщения непосредственно на homeScreenController
.
Если вы хотите обобщить вышеупомянутую реализацию, чтобы ваши контроллеры не были специально осведомлены друг о друге, тогда вы можете определить протокол и пройти homeScreenController
через него в качестве делегата, поддерживающего этот протокол.
Комментарии:
1. спасибо за подробное объяснение. это то, что должно выполняться, когда я нажимаю detailview. пожалуйста, поправьте меня, если я ошибаюсь. — (недействительно)pushDetailMessageController { DetailMessagetController *detailmessage = [[Выделение DetailMessagetController] инициализация]; detailmessage. делегировать = self; // вставьте messageListController в навигационный контроллер здесь [подробная версия]; }
2. Нет, в моем примере не использовался протокол или не определялся
delegate
iVar amp; property. Если вы используете мой пример, для нажатия adetailViewController
вы бы сделали то же самое, что я делал при нажатии наmessageListController
. После выделения / инициализации установите егоhomeScreenController
свойство дляhomeScreenController
экземпляра, который был передан вmessageListController
.
Ответ №2:
Как насчет добавления метода в messageslistcontroller? Я лично добавил бы делегат «homescreenview» в detailmessageviewcontroller, поскольку messageslistcontroller не имеет никакого отношения к ответу, и, по-видимому, homescreenviewcontroller это делает.
при создании detailmessageviewcontroller в messageslistcontroller сделайте это:
detailmessageviewcontroller.homeScreenDelegate = self.delegate;
Ответ №3:
Один подход (без делегирования)
поскольку вы используете navigationController
, so [[self.navigationController viewControllers]objectAtIndex:0]
всегда будет возвращать вас homeScreenViewController
….. вы можете использовать этот объект….
Спасибо,
Комментарии:
1. если у вас есть прямой вызов, тогда мы не должны использовать делегирование или уведомление, это увеличивает нагрузку на приложение.
2. ваш ответ хорош, хотя это означает, что контроллеры будут делать предположения об объекте в корне стека навигации. Для конкретного приложения вы можете это сделать. Я предпочитаю реализовывать свои классы таким образом, чтобы они были инкапсулированы и легко использовались повторно. Это именно то, что помогают делать протоколы (используемые делегатами) и уведомления. Ваш комментарий неверен. Ни один из методов не добавляет значимых накладных расходов. Делегат — это просто указатель (сохраненный или назначенный), и уведомления широко используются в iOS.
3. @XJones я попробовал именно то, что вы сказали, я могу отправить сообщение в homescreencontroller из detailview. но у меня все еще есть одно предупреждение при таком подходе. поскольку объект homescreen является переменной экземпляра в detailview, когда я отправляю сообщение объекту homescreen, в нем говорится «Метод xxx не найден (возвращаемый тип по умолчанию равен id)».