2013-02-09 4 views
0

У меня есть 3 кнопки, представляющие 3 разных изображения. Изображение будет отображаться всякий раз, когда будет нажата его кнопка. Мой вопрос в том, как использовать теги if() и NSArray/NSMutableDictionary/UIButton или другой метод, чтобы сделать коды короче.Отображение изображения при нажатии кнопки?

- (id)initWithFrame:(CGRect)frame 
{ 
    _button1 = [UIButton buttonWithType:UIButtonTypeCustom]; 
    _button1.frame = CGRectMake(20, 250, 50, 50); 
    [_button1 addTarget:self action:@selector(button1Tapped) forControlEvents:UIControlEventTouchUpInside]; 
    [self addSubview:_button1]; 

    _button2 = [UIButton buttonWithType:UIButtonTypeCustom]; 
    _button2.frame = CGRectMake(140, 250, 50, 50); 
    [_button2 addTarget:self action:@selector(button2Tapped) forControlEvents:UIControlEventTouchUpInside]; 
    [self addSubview:_button2]; 

    _button3 = [UIButton buttonWithType:UIButtonTypeCustom]; 
    _button3.frame = CGRectMake(210, 250, 50, 50); 
    [_button3 addTarget:self action:@selector(button3Tapped) forControlEvents:UIControlEventTouchUpInside]; 
    [self addSubview:_button3]; 
} 

- (void)button1Tapped 
{ 
    UIImage *_image = [UIImage imageNamed:@"IMAGE_1"]; 
    _imageView = [[UIImageView alloc] initWithImage:_image]; 
    _imageView.frame = CGRectMake(0, 0, 256, 384);   
    [self addSubview:_imageView]; 
} 

- (void)button2Tapped 
{ 
    UIImage *_image = [UIImage imageNamed:@"IMAGE_2"]; 
    _imageView = [[UIImageView alloc] initWithImage:_image]; 
    _imageView.frame = CGRectMake(0, 0, 256, 384);   
    [self addSubview:_imageView]; 
} 

- (void)button3Tapped 
{ 
    UIImage *_image = [UIImage imageNamed:@"IMAGE_3"]; 
    _imageView = [[UIImageView alloc] initWithImage:_image]; 
    _imageView.frame = CGRectMake(0, 0, 256, 384);   
    [self addSubview:_imageView]; 
} 

Thanks.

+0

Да, сегодня день рефакторинга. Просто ответил на подобный, как 10 минут назад. – 2013-02-09 22:30:04

+1

BTW: используйте массив для хранения кнопок, затем ** используйте ** аргумент 'sender' методов действия. – 2013-02-09 22:30:31

+0

@ H2CO3 спасибо за понимание. Ваш ответ рефакторинга очень полезен для другой части моих кодов! – askingtoomuch

ответ

1

Настройка массива изображений, подобных этому. Сделайте это свойством в своем классе. Кроме того, создайте изображение одновременно.

@property(nonatomic, strong) NSArray *images; 
@property(nonatomic, strong) UIImageView *imageView; 

- (id)initWithFrame:(CGRect)frame { 

    self.images = [NSArray arrayWithObjects:[UIImage imageNamed:@"IMAGE_1"], [UIImage imageNamed:@"IMAGE_2"], [UIImage imageNamed:@"IMAGE_3"], nil]; 

    _imageView = [[UIImageView alloc] initWithImage:[self.images objectAtIndex:0]]; 
    _imageView.frame = CGRectMake(0, 0, 256, 384);   
    [self addSubview:_imageView]; 
} 

При создании кнопки, дать им теги, как это ...

_button1.tag = 1; 
_button2.tag = 2; 
_button3.tag = 3; 

Кроме того, при создании кнопок, чтобы они все используют один и тот же селектор на кране ...

[_button1 addTarget:self action:@selector(buttonTapped) forControlEvents:UIControlEventTouchUpInside]; 
[_button2 addTarget:self action:@selector(buttonTapped) forControlEvents:UIControlEventTouchUpInside]; 
// etc 

На отводе метка-1 будет индексом массива ...

- (void)buttonTapped:(id)sender { 

    NSUInteger tag = ((UIButton *)sender).tag; 
    UIImage *image = [self.images objectAtIndex:tag]; 
    self.imageView.image = image; 
} 
+0

Получил! Огромное спасибо. Никогда не думал получить ответ в течение нескольких часов! – askingtoomuch

+0

Мне нужно заменить 'sender.tag' на' [sender tag] ', чтобы он работал. Разве они не то же самое? – askingtoomuch

+0

Да. Это то же самое. Это потому, что тип является общим типом идентификатора. Я редактировал, чтобы показать более правильный синтаксис. – danh

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