Приложение для iPhone - Как один View может вызывать метод в другом View? - PullRequest
1 голос
/ 06 мая 2009

Я делаю простое приложение для панели вкладок iPhone. Он имеет две вкладки, одна с UIWebView, а другая с несколькими текстовыми полями для хранения настроек и кнопка для сохранения настроек.

Что я хочу сделать, это перезагрузить UIWebView, когда пользователь нажимает сохранить на вкладке настроек / просмотра. У меня уже есть сохранение настроек, мне просто нужно выяснить, как выполнить вызов, чтобы само обновление UIWebView обновилось.

Я запутался в том, как представление может отправлять сообщения в другое представление.

Ответы [ 5 ]

5 голосов
/ 06 мая 2009

Тот факт, что вы используете эти два представления в рамках UITabBarController, не имеет отношения к сути проблемы; а именно, что вы хотите, чтобы одна часть вашего приложения была уведомлена о том, что что-то произошло в другой части. Типичный способ сделать это с помощью KVO или с помощью NSNotificationCenter, например, так:

// Register interest in finding out when the settings are changed
[[NSNotificationCenter defaultCenter] addObserver:myWebViewController 
    selector:@selector(refreshWebView:) name:@"settingsSaved" object:nil];

// Notify interested parties that the settings have changed
[[NSNotificationCenter defaultCenter] postNotificationName:@"settingsSaved" object:nil];
4 голосов
/ 06 мая 2009

Я сделал так, чтобы они общались друг с другом через AppDelegate.

Например:

View1 будет иметь функцию, которая:

MyAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
    [appDelegate myFunction];

MyAppDelegate имеет функцию myFunction, которая либо что-то делает, либо вызывает:

[viewController myViewFunction];

Я настроил довольно симпатичную систему для загрузки нескольких видов (и перемещения назад и вперед, как если бы это были разные экраны). Я просто не удосужился написать это и опубликовать на pushplay.net - но я постараюсь сделать это в ближайшие пару дней ...

===

РЕДАКТИРОВАТЬ: Хорошо, я опубликовал, что у меня есть. Любые комментарии будут оценены.

http://pushplay.net/blog_detail.php?id=27

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

1 голос
/ 06 мая 2009

В этом случае вам, вероятно, будет лучше, если ваш делегат приложения назначит контроллер, содержащий веб-представление, в качестве делегата вашего другого контроллера представления при запуске приложения - изучите использование протокола, чтобы сделать его чистым, но для чего-то простого вы всегда можно просто объявить тип делегата в качестве веб-представления, содержащего контроллер представления.

Уведомления также являются хорошей идеей, и для них нет слишком малой задачи, но вы должны знать, что важно отписаться от уведомлений в таких местах, как dealloc. Для верхнего уровня контроллера панели вкладок это не имеет большого значения.

1 голос
/ 06 мая 2009

Это зависит от сложности конкретного приложения и модели объекта в этом приложении:

  • Если представления связаны и сообщения относятся только к представлениям, то они могут отправлять друг другу сообщения напрямую. Например, представление может (и должно) отправлять сообщения непосредственно в его подвиды, и они могут отправлять сообщения непосредственно своему родителю.

  • Если их представления не связаны, но показывают данные об одной и той же информации, вы должны использовать прокси-сообщения через viewController - именно поэтому у вас есть контроллер представления.

  • Если у вас сложное приложение с мощной архитектурой MVC, связь должна осуществляться косвенно путем обновления объектов модели и каскадного представления этих представлений через их контроллеры view.

0 голосов
/ 07 мая 2009

Вы всегда можете установить переменную экземпляра в вашем контроллере представления вкладок, которая указывает на веб-представление. Просто установите его как IBOutlet, подключите его в Интерфейсном Разработчике и затем вызовите свой метод для переменной экземпляра.

.h файл:

IBOutlet UIWebView *webView;

@property (nonatomic, retain) UIWebView *webView;

.m файл:

@synthesize webView;

//Then later in your method
[webView refresh]; //or however you do it

С уважением,

Кайл

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...