2013-04-17 4 views
2

У меня есть подкласс UIButton:пользовательского UIButton в не называется

@interface MyButton : UIButton 
- (IBAction) buttonPressed:(id)sender; 
@end 

@implementation MyButton 

- (void)awakeFromNib 
{ 
    NSLog(@"awake from nib"); 
} 


- (IBAction) buttonPressed:(id)sender 
{ 
    NSLog(@"button pressed"); 
} 

@end 

добавить кнопку в моей родительской XIb, установите это класс MyButton, и связано это действие методу buttonPressedFirst Responder «s.

Когда я запускаю приложение и загружаю родительский xib с помощью моей кнопки внутри, вызывается awakeFromNib из класса MyButton. Но когда я нажимаю кнопку, ничего не происходит. Я ожидал, что будет вызван мой метод buttonPressed от MyButton.

Я предположил, что взгляд моей кнопки является первым ответчиком в цепочке ответчиков, но, видимо, я делаю что-то неправильно.

Не могли бы вы предложить что-нибудь?

+0

Это похоже на совершенно неправильный способ сделать попытку сделать пользовательское действие для кнопки. Вы вообще не знакомы с программированием Objective-C? –

+0

@ DanF Цель состоит в том, чтобы использовать эту кнопку в разных xibs без copypasting действия, которое будет одинаковым для всех случаев. Не могли бы вы предложить другой подход? – Anastasia

ответ

3

Если вы хотите, чтобы ваша кнопка всегда вызывать метод, объявленный добавить код, указанный выше в awakeFromNib метода

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

и позже, когда вы добавили его в контроллер представления не присвоить ему новое действие, таким образом, он всегда будет вызывать ваш метод.

+0

Спасибо. Все еще не могу понять, почему он не работает с 'addTarget: nil', но по крайней мере он работает с' addTarget: self'. – Anastasia

+0

, когда вы вызываете 'addTarget: action: forControlEvents:' вы сообщаете компилятору, что при создании события, указанного в последнем параметре, он должен вызывать селектор, определенный в действии объекта, указанного в параметре Target, если вы укажите 'nil', тогда метод отправляется на' nil' – tkanzakic

+0

Я думал, что 'addTarget: nil' означает то же самое, если я подключу действие к первому ответчику в IB, а это означает, что система должна использовать цепочку ответчиков для отправьте действие. (Я узнал это здесь: http://stackoverflow.com/questions/598455/objective-c-cocoa-first-responder-did-i-get-that-right) Если это правильно, я бы ожидал, что мой метод кнопки будет вызываться как метод первого ответчика. И я не понимаю, почему он работает так, как ожидалось. – Anastasia

3

В зависимости от того, что вы делаете с помощью кнопки - нет необходимости создавать подкласс.

Вот код, как сделать простую кнопку, которая вызывает метод:

UIButton *myButton = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 
[myButton setFrame:CGRectMake(10, 10, 100, 30)]; 
[myButton setTitle:@"Title" forState:UIControlStateNormal]; 
[myButton addTarget:self action:@selector(myMethod:) forControlEvents:UIControlEventTouchUpInside]; 
[self.view addSubview:myButton]; 

надстройку целевой бит говорит кнопку, чтобы вызвать данный селектор, когда пользователь прикасается внутри кнопки (стучит его) , Цель - объект, в котором находится селектор.

Надеюсь, что это поможет, вам не нужно подклассифицировать UIButton, если у вас нет настраиваемых макетов или специальных пользовательских функций для него.

2

Поскольку вы хотите обработать действие из самого кода кнопки, вам может потребоваться переопределить этот метод - (void)sendActionsForControlEvents:(UIControlEvents)controlEvents и обработать ваше событие, как если бы оно было отправлено на вашу кнопку;

Смежные вопросы