Подкласс UIButton не отвечает на суперметоды?

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

Я добавил оба изображения в стандартное и выбранное состояние кнопки в конструкторе интерфейсов.

Теперь я создал подкласс UIButton. Моя идея состоит в том, чтобы перехватить нажатие на эту кнопку и изменить состояние кнопки. Поэтому я добавил это в подкласс UIButton, надеясь, что один из этих методов будет запускаться нажатием.

- (void)sendAction:(SEL)action
                to:(id)target
          forEvent:(UIEvent *)event {

  [super sendAction:action to:target forEvent:event];

  // toggle state
  [self setSelected:![self isSelected]];

}


- (void)sendActionsForControlEvents:(UIControlEvents)controlEvents {
  [super sendActionsForControlEvents:controlEvents];

  // toggle state
  [self setSelected:![self isSelected]];

}


- (void)touchesEnded:(NSSet *)touches
           withEvent:(UIEvent *)event {

  [super touchesEnded:touches withEvent:event];
  // toggle state
  [self setSelected:![self isSelected]];
}

Ни один из этих методов не запускается. Любые подсказки?


person Duck    schedule 11.02.2015    source источник
comment
Подключена ли кнопка к одному из них в IB и настроена ли она на подкласс в инспекторе идентификации?   -  person mc01    schedule 11.02.2015
comment
Возможно, вам следует попробовать другой подход, проверьте этот вопрос   -  person Leonardo    schedule 11.02.2015
comment
что ты имеешь в виду? Кнопка была добавлена ​​в построитель интерфейсов и там было задано действие, путем перетаскивания в класс, который она использует.   -  person Duck    schedule 11.02.2015


Ответы (3)


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

Вот репозиторий на GitHub: Нажмите здесь
--> Примечание. Вам понадобится >= Xcode 6 для запуска проекта.

Несколько моментов, на которые следует обратить внимание в проекте:
1 – обязательно подключите кнопку на Main.storyboard к созданному вами классу.
2. В Swift class MyButton: UIButton — это строка, которая реализует UIButton для класса. Я уверен, что есть эквивалент ObjC, этот вопрос о переполнении стека может быть полезен синтаксически: Нажмите здесь

Надеюсь, что-то из этого будет полезно!

Удачи,
Кайл

person kbpontius    schedule 11.02.2015
comment
Спасибо. Я просто воссоздал все, и теперь это работает. Это должно быть одна из тех проблем с Xcode. - person Duck; 11.02.2015

Я предполагаю, что первые два не вызываются, потому что у кнопки нет targets, зарегистрированных с selectors. Третьего, которого не назвали, немного удивительно.

При этом вам стоит попробовать [self addTarget:self action:@selector(buttonTapped:) forControlEvents: UIControlEventsTouchUpInside].

person InkGolem    schedule 11.02.2015
comment
действие устанавливается на конструкторе интерфейса. Удивительно, но если я добавляю точку останова к действию, я вижу это в потоке: [UIApplication sendAction:to:forEvent:], что теоретически является первым методом, который я добавил. - person Duck; 11.02.2015

Это может произойти только в том случае, если вы не вызвали addTarget в подклассе UIButton.

person Vinod Vishwanath    schedule 11.02.2015
comment
что ты имеешь в виду? Действие задается на построителе интерфейса. - person Duck; 11.02.2015