Программно добавить IBAction в UIButton

Я пытаюсь добавить действие к 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;

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


person shaw2thefloor    schedule 30.06.2011    source источник


Ответы (5)


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

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

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

person Deepak Danduprolu    schedule 30.06.2011

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

person taskinoor    schedule 30.06.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];
person ipraba    schedule 30.06.2011
comment
setImage: или setImage: forState:? - person taskinoor; 30.06.2011

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

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

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

[self.profileButton setImage: myIcon forState:UIControlStateNormal];
person filipe    schedule 30.06.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];
person beryllium    schedule 30.06.2011