#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 Я понимаю, почему вы хотели бы это сделать, поэтому я обновил свой ответ, включив в него, как это сделать. Однако я все еще не уверен, что мне нравится дизайн.