Реализация функции переключения в UIButton
Я хочу знать, как добавить функцию переключения на UIButton
что-то вроде того, как пользователь нажимает на невыбранную кнопку, кнопка становится выбранной и остается выбранной, пока пользователь снова не коснется ее, сделав невыбранным, как это было раньше.
Я думал сделать IBAction
что меняет его с невыбранного на выбранное, как я могу это сделать?
Вот что я попробовал:
-(IBAction)toggle {
//Toggle on implementation.
button.selected = YES;
button.highlighted = NO;
button.enabled = YES;
//Toggle off implementation.
if (button.highlighted == YES) {
button.selected = NO;
button.highlighted = YES;
button.enabled = NO;
}
}
Проблема...
-(IBAction)toggleFav {
if (favButton == nil) {
UIImage *unselectedImage = [UIImage imageNamed:@"favUntapped.png"];
UIImage *selectedImage = [UIImage imageNamed:@"favTapped.png"];
[favButton setImage:unselectedImage forState:UIControlStateNormal];
[favButton setImage:selectedImage forState:UIControlStateSelected];
[favButton setFrame:CGRectMake(0, 0, 40, 40)];
}
if([favButton isSelected]){
//Add to menu.
[favButton setSelected:NO];
} else {
//Remove from menu.
[favButton setSelected:YES];
}
}
4 ответа
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
UIImage *unselectedImage = [UIImage imageNamed:@"unselected.png"];
UIImage *selectedImage = [UIImage imageNamed:@"selected.png"];
UIButton *b = [UIButton buttonWithType:UIButtonTypeCustom];
[b setBackgroundImage:unselectedImage forState:UIControlStateNormal];
[b setBackgroundImage:selectedImage forState:UIControlStateSelected];
[b addTarget:self action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchUpInside];
[b setFrame:CGRectMake(0, 0, 40, 40)];
[cell.contentView addSubview:b];
}
return cell;
}
-(void) buttonPressed:(UIButton *)sender
{
if([sender isSelected]){
//...
[sender setSelected:NO];
} else {
//...
[sender setSelected:YES];
}
}
редактировать
Ваш toggleFav
код не имеет особого смысла.if (favButton == nil) {
проверяет, если favButton
настоящее. Но если вы связываете это с IB, оно всегда должно быть там. А если бы не было, как кнопка могла вызвать этот метод? Так что сделайте это так:
-(void)viewDidLoad
{
//....
UIImage *unselectedImage = [UIImage imageNamed:@"favUntapped.png"];
UIImage *selectedImage = [UIImage imageNamed:@"favTapped.png"];
[favButton setImage:unselectedImage forState:UIControlStateNormal];
[favButton setImage:selectedImage forState:UIControlStateSelected];
[favButton setFrame:CGRectMake(0, 0, 40, 40)];
//....
}
-(IBAction)toggleFav:(UIButton *)sender {
if([sender isSelected]){
//...
[sender setSelected:NO];
} else {
//...
[sender setSelected:YES];
}
}
редактировать
Здесь вы найдете пример проекта с DetaiView, который содержит кнопку с двумя состояниями.
Примечание: я сохраняю информацию о том, какая кнопка была выбрана в NSUserDefaults. Вы не должны этого делать. Вместо этого вы хотите сохранить его в модели. Но поскольку у меня нет информации о вашей модели, я просто использую NSUserDefaults.
-(void)hitButton:(UIButton*)button
{
buttonOnFlag = !buttonOnFlag;
if( buttonFlag )
[self performSelector:@selector(setHighlight:) withObject:button afterDelay:0];
}
- (void)setHighlight:(UIButton*)button
{
button.highlighted = true;
}
U должен код, как это
-(IBAction)toggle:(id)sender {
//Toggle on implementation.
if (sender.highlighted == NO)
{
sender.selected = YES;
sender.highlighted = NO;
sender.enabled = YES;
}
//Toggle off implementation.
else{
sender.selected = NO;
sender.highlighted = YES;
sender.enabled = NO;
}
}