#iphone #cocoa-touch
#iPhone #cocoa-touch
Вопрос:
У меня есть приложение, в котором я использовал UITabBarController
с 3 кнопками. Итак, у меня также есть 3 класса. Что я хочу сделать, так это вызвать - (IBAction) doSomething: (id) sender {}
в классе 1 (просмотр 1) с помощью кнопки в классе 2 (просмотр 2).
Ответ №1:
Возьмите все, что делает ваш doSomething
метод (не функция), и используйте это для создания метода в новом классе. Оба контроллера могут импортировать класс, создавать его экземпляр и использовать метод.
В качестве альтернативы вы можете отправить уведомление на любой контроллер, который имеет doSomething
, но если код в методе действительно применим к обоим контроллерам, предоставьте его обоим контроллерам.
Вы можете заставить один контроллер отправлять уведомление другому. Когда вы хотите уведомить класс 1 о выполнении кода, нажатого на кнопку, вы отправите уведомление, подобное этому:
[[NSNotificationCenter defaultCenter] postNotificationName:@"ABCPerformButtonAction"
object:nil];
Вам не обязательно вызывать это ABCPerformButtonAction, вам просто нужна строка, которую вы узнаете, и что-то еще — я использовал ABC, потому что я не знаю ваших инициалов или названия приложения или чего-то еще — чтобы убедиться, что вы случайно не отправите уведомление с тем же именем, что и уведомление, о прослушивании которого вы не знаете (включая используемые вами сторонние библиотеки и т.д.).
Когда это уведомление будет отправлено, любой объект, который зарегистрировался в defaultCenter для прослушивания @»ABCPerformButtonAction», выполнит любые действия, которые вы выберете. Вот как регистрируется контроллер 1 (это должно быть расположено в каком-нибудь месте, например viewDidLoad или метод инициализации объекта):
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(performDoSomething:)
name:@"ABCPerformButtonAction"
object:nil];
Тамошний селектор performDoSomething: — это просто название метода, который вы хотите запустить при отправке уведомления. Этот метод должен иметь определенный формат, поэтому вы не можете напрямую вызвать свой метод doSomething. Это выглядело бы так:
- (void)performDoSomething:(NSNotification *)notif {
[self doSomething];
}
Как вы можете видеть, все, что он делает, это вызывает метод. Очевидно, что это могло бы сделать гораздо больше, и вы даже можете отправлять информацию вместе с уведомлением (см. Ниже).
Наконец, важно, чтобы вы также удалили свой объект в качестве наблюдателя, прежде чем он будет освобожден. В вашем методе Dealloc для каждого объекта, который зарегистрировался для получения уведомления, вы добавляете это:
[[NSNotificationCenter defaultCenter] removeObserver:self];
Надеюсь, это имеет смысл. В документации Apple для NSNotificationCenter объясняется больше, и они предоставляют несколько примеров приложений, которые используют уведомления.
Комментарии:
1. правильный метод :). но это немного сложнее. позвольте мне объяснить. Во втором классе у меня есть метод сохранения некоторых настроек в nsarray и сохранения его в plist (все происходит при нажатии кнопки). когда я переключаюсь обратно на первое представление из второго представления, мне приходится использовать этот параметр напрямую, ничего не делая. Итак, я хочу поместить некоторый код в метод во втором классе, чтобы вызвать метод в первом классе, который получает настройки.
2. Хорошо, я добавил объяснение того, как отправить уведомление, которое будет делать то, что вы хотите.