Программно добавить IBAction в UIButton - PullRequest
0 голосов
/ 30 июня 2011

Я пытаюсь добавить действие в UIButton, но получаю исключение:

Завершение работы приложения из-за необработанного исключения «NSInvalidArgumentException», причина: «[UIImageView addTarget: action: forControlEvents:]: нераспознанный селектор отправлен в экземпляр 0x595fba0 '

Вот мой код:

- (void)viewDidLoad
{
    [super viewDidLoad];

    UIImage *myIcon = [UIImage imageNamed:@"Icon_Profile"];
    self.profileButton = (UIButton*)[[UIImageView alloc] initWithImage:myIcon];

    [self.profileButton addTarget:self action:@selector(profileButtonPressed:) forControlEvents:UIControlEventTouchUpInside];

    UIBarButtonItem *buttonItem = [[[UIBarButtonItem alloc] initWithCustomView:profileButton] autorelease];

    NSArray *toolbarItems = [[NSArray alloc] initWithObjects:buttonItem, nil];

    [self setToolbarItems:toolbarItems animated:NO];

    //[toolbarItems release];
    //[profileButton release];
}

Тогда у меня есть этот метод в том же контроллере View:

-(void)profileButtonPressed:(id)sender{

}

А в шапке у меня

-(IBAction)profileButtonPressed:(id)sender;

Что происходит?

Ответы [ 5 ]

4 голосов
/ 30 июня 2011

Вы применяете UIImageView к UIButton, который не отвечает на addTarget:action:forControlEvents:.Создайте актуальную кнопку и установите изображение для разных состояний, используя setBackgroundImage:forState: или setImage:forState: из UIButton.

3 голосов
/ 30 июня 2011

Почему вы преобразуете UIImageView в кнопку.

UIImage *myIcon = [UIImage imageNamed:@"Icon_Profile"];
self.profileButton = [UIButton buttonWithStyle:UIButtonStyleCustom];
[self.profileButton setImage:myIcon forState:UIControlStateNormal];
[self.profileButton addTarget:self action:@selector(profileButtonPressed:) forControlEvents:UIControlEventTouchUpInside];
2 голосов
/ 30 июня 2011

Нельзя привести объект UIImageView к UIButton и ожидать, что он будет вести себя как UIButton.Поскольку вы намереваетесь создать UIBarButtonItem, используйте initWithImage:style:target:action: для его инициализации с изображением.

UIBarButtonItem *buttonItem = [[[UIBarButtonItem alloc] initWithImage:myIcon style:UIBarButtonItemStylePlain target:self action:@selector(profileButtonPressed:)] autorelease]; 

Я думаю, что это лучший подход по сравнению с созданием UIButton и назначением его в качестве пользовательского представления..

2 голосов
/ 30 июня 2011

Сначала создайте свою собственную кнопку.И добавьте действие после:

UIImage *myIcon = [UIImage imageNamed:@"Icon_Profile"];
UIButton *buttonPlay = [UIButton buttonWithType:UIButtonTypeCustom];
buttonPlay.frame = CGRectMake(0, 0, 20, 20);
[buttonPlay setBackgroundImage:myIcon forState:UIControlStateNormal];
[buttonPlay addTarget:self action:@selector(buttonPlayClick:) forControlEvents:UIControlEventTouchUpInside];

И ваш селектор должен выглядеть следующим образом

- (void)buttonPlayClick:(UIButton*)sender{
}

Теперь вы можете создавать собственные элементы панели

UIBarButtonItem *buttonItem = [[[UIBarButtonItem alloc] initWithCustomView:buttonPlay] autorelease];
2 голосов
/ 30 июня 2011

Это выглядит очень неправильно:

self.profileButton = (UIButton*)[[UIImageView alloc] initWithImage:myIcon];

A UIImageView не является UIButton. Вы должны alloc и init правильные UIButton, а затем вы можете позвонить

[self.profileButton setImage: myIcon forState:UIControlStateNormal];
...