Вызов функции (IBAction) в классе с помощью кнопки в другом классе (и просмотра)

#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. Хорошо, я добавил объяснение того, как отправить уведомление, которое будет делать то, что вы хотите.