2013-02-20 2 views
0

У меня есть вопрос о чем-то, над чем я работал некоторое время. У меня есть UIPickerView, в котором перечислены разные типы продуктов. Мой массив выглядит такой:изменить изображение кнопки из UIPickerView

food = [[NSMutableArray alloc] init]; 
    [activities addObject:@"Pasta"]; 
    [activities addObject:@"Pizza"]; 
    [activities addObject:@"Spaghetti"]; 
    [activities addObject:@"Salad"]; 

И мой массив изображение:

foodImages = [[NSMutableArray alloc] init]; 
     [activities addObject:@"Pasta.png"]; 
     [activities addObject:@"Pizza.png"]; 
     [activities addObject:@"Spaghetti.png"]; 
     [activities addObject:@"Salad.png"]; 

То, что я пытаюсь выяснить, если, когда пользователь выбирает элемент с точки зрения сборщика, если я могу изменить изображение кнопки. Поэтому, если паста выбрана из UIPickerView, она изменит изображение кнопки на «Pasta.png». Как я могу добиться этого в Xcode?

+0

Что вы пробовали? Вы знаете, как получить выделение из представления выбора? Вы знаете, как установить изображение кнопки? – rdelmar

ответ

1

Вы, безусловно, можете это сделать. Прежде всего, хотя было бы гораздо лучше сохранить ссылки на изображения и имя продукта в одном массиве. Это сделает ваше приложение более масштабируемым, а изменения кода вряд ли вызовут ошибки.

Вы можете сделать это следующим образом:

food = [[NSMutableArray alloc] init]; 
[food insertObject:[NSMutableArray arrayWithObjects:@"Pasta",@"Pasta.png",nil] atIndex:[food count]]; 
[food insertObject:[NSMutableArray arrayWithObjects:@"Pizza",@"Pizza.png",nil] atIndex:[food count]]; 

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


Что касается настройки изображения для UIPicker вы могли бы сделать что-то вроде этого (Вы должны добавить UIPickerViewDelegate в .h и вызвать [self setPickerValue];, где когда-либо вы хотите, чтобы показать свою UIPicker - возможно, кнопку или текстовое поле?):

-(void)setPickerValue { 
    pickerActionSheet = [[UIActionSheet alloc] initWithTitle:nil delegate:nil cancelButtonTitle:nil destructiveButtonTitle:nil otherButtonTitles:nil, nil]; 
    [pickerActionSheet setActionSheetStyle:UIActionSheetStyleBlackTranslucent]; 
    CGRect pickerFrame = CGRectMake(0, 44, 0, 0); 
    UIPickerView *valuesPicker = [[UIPickerView alloc] initWithFrame:pickerFrame]; 

    [valuesPicker setDataSource: self]; 
    [valuesPicker setDelegate: self]; 
    valuesPicker.showsSelectionIndicator = YES; 
    [pickerActionSheet addSubview:valuesPicker]; 

    UIToolbar *controlToolBar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, 320, 44)]; 
    [controlToolBar setBarStyle:UIBarStyleBlack]; 
    [controlToolBar sizeToFit]; 

    UIBarButtonItem *spacer = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil]; 
    UIBarButtonItem *setButton = [[UIBarButtonItem alloc] initWithTitle:@"Set" style:UIBarButtonItemStyleDone target:self action:@selector(dismissPicker)]; 
    UIBarButtonItem *cancelButton = [[UIBarButtonItem alloc] initWithTitle:@"Cancel" style:UIBarButtonItemStyleBordered target:self action:@selector(cancelPicker)]; 
    [controlToolBar setItems:[NSArray arrayWithObjects:cancelButton, spacer, setButton, nil] animated:NO]; 

    [pickerActionSheet addSubview:controlToolBar]; 
    [pickerActionSheet showInView:self.view]; 
    [pickerActionSheet setBounds:CGRectMake(0, 0, 320, 485)]; 
} 
-(void)cancelPicker { 
    [pickerActionSheet dismissWithClickedButtonIndex:0 animated:YES]; 
} 
// Number of components. 
-(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView{ 
    return 1; 
} 
// Total rows in our component. 
-(NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component{ 
    return [food count]; 
} 
// Display each row's data. 
-(NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component{ 
    return [[food objectAtIndex: row] objectAtIndex:0]; 
} 

Приведенный выше код делает приятный выборщик с отменой и кнопкой ok в качестве панели инструментов. Последняя функция, вам нужно это (предполагая, что вы есть UIButton под названием "Button1"):

-(void)dismissPicker { 
    [button1 setImage:[UIImage imageNamed: [[food objectAtIndex:row] objectAtIndex:1]] forState:UIControlStateNormal]; 
    [pickerActionSheet dismissWithClickedButtonIndex:0 animated:YES]; 
} 
+1

спасибо, очень подробно! Это получилось великолепно. – bardockyo

1

[yourButton setImage:[UIImage imageNamed:[foodImages objectAtIndex:0]] forState:UIControlStateNormal]; // objectAtIndex 0 вернет "Pasta.PNG", 1 вернется пицца и т.д.

+0

работал безупречно. Я закончил с помощью [food1 setImage: [UIImage imageNamed: [foodImages objectAtIndex: [pickerView selectedRowInComponent: 0]]] forState: UIControlStateNormal]; так как они находятся в том же порядке в массивах – bardockyo

+0

Рад, что вы получили его! Рад, что смог помочь! Бог благословил! –

1

Реализовать UIPickerViewDelegate метод (docs):

- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component { 

    NSString *imageName = foodImages[row]; 

    [button setImage:[UIImage imageNamed:imageName] forState:UIControlStateNormal]; 

} 

Установите Делегирование сборщика:

pickerView.delegate = self; 

Затем добавьте свои изображения в проект Xcode (если вы еще этого не сделали).

Возможно, вы также захотите установить изображение для разных состояний или используйте setBackgroundImage:forState, если вы также хотите текст на кнопке (см. UIButton docs для получения дополнительной информации).

0

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

Если вы хотите придерживаться двух массивов, то получите индекс выбранной пищи и до тех пор, пока массив foodImages будет отображать массив продуктов, вы можете использовать это значение для объектаAtIndex для загрузки изображения.

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