iPhone добавляет событие для кнопки в другом классе

#iphone #objective-c

#iPhone #objective-c

Вопрос:

У меня есть контроллер представления, давайте назовем его «View Controller A». У меня есть другой класс (производный от NSObject и в паре .h и .m), давайте назовем этот класс «B». Из функции «B» я добавляю кнопку в «A» с помощью addSubview. Кнопка добавляется, но теперь я хочу прикрепить событие к этой новой кнопке. Я использую

 [newButton addTarget:self etc. etc.]
  

но это не работает.

Я не хочу объявлять событие в контроллере представления «A». Есть ли какой-нибудь способ избавиться от этого?

Спасибо всем, что прочитали это..

Ответ №1:

 [newButton addTarget:viewControllerA etc. etc.]
  

РЕДАКТИРОВАТЬ: более полная версия:

 [newButton addTarget:viewControllerA action:@selector(buttonAction:) forControlEvents:UIControlEventTouchUpInside];
  

Это предполагает, что класс B имеет ссылку на контроллер просмотра с именем A viewControllerA . Также предполагается, что контроллер представления A реализовал метод:

 - (void)buttonAction:(id)sender;
  

ПРАВКА 2: Итак, это то, что вы хотите:

 [newButton addTarget:self action:@selector(buttonAction:) forControlEvents:UIControlEventTouchUpInside];
  

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

   (void)addButtonToController:(UIViewController *)controller;
  

Это метод класса. В классе нет self метода. Одно из возможных решений — сделать его одноэлементным классом и просто изменить метод на:

 - (void)addButtonToController:(UIViewController *)controller;
  

Вы бы вызвали этот метод, используя:

 [[ClassB sharedInstance] addButtonToController:controller];
  

Если вы не знаете, как создать одноэлементный класс, я мог бы обновить свой ответ в третий раз, включив это. 🙂

ПРАВКА 3: Я все еще думаю, что мой первоначальный ответ правильный. Вам не обязательно реализовывать - (void)buttonAction:(id)sender; в каждом контроллере. Вы могли бы использовать наследование или категорию, чтобы иметь доступ к этому методу в каждом контроллере без необходимости реализовывать его для каждого контроллера. Если вам нужна помощь с этим, дайте мне знать.

Комментарии:

1. Но при этом ViewControllerA должен иметь этот метод (метод селектора), а я не хочу добавлять метод в ViewControllerA. : (

2. У @Guru, чтобы не нарушать MVC viewControllerA , должен быть этот метод. Если вам не нравится MVC, что, я думаю, вам следует, вы могли бы поручить классу B (или любому другому классу) обработать событие, но это был бы плохой дизайн, и я не рекомендую его.

3. Допустим, у меня есть 26 ViewController от «A» до «Z», и у меня есть статический метод в классе «B», который добавляет эту кнопку в вызывающий класс, такой как «A», «B» и т.д.. Это означает, что у меня есть класс «B», который добавляет одну и ту же кнопку ко всем классам, кнопка выполняет одно и то же действие на всех viewcontroller, поэтому я не хочу писать — (void)buttonAction:(id)sender; для всех этих 26 классов, поэтому мне нужно решение, в котором я могу определить buttonAction в самом классе «B», и я могу использовать кнопку из любого места без написания какого-либо дополнительного кода. Это было то, чего я хотел. 🙂

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