2013-04-02 6 views
2

Можно ли изменить изображение UITableViewCellAccessoryDetailDisclosureButton на ощупь?Изменить показания индикатора раскрытия информации при касании

Я хотел бы, чтобы мои строки в таблицеView имели пустой круг вместо кнопки раскрытия подробностей. Когда я нажимаю эту кнопку пустого круга, я хотел бы изменить изображение пустого круга с другим изображением, содержащим галочку. Затем, после задержки около полутора секунд, я хотел бы выполнить действие с -accessoryButtonTappedForRowWithIndexPath.

Как это сделать?

+0

@GabrielePetronella Я уже в состоянии настроить кнопку так, что она имеет пустой круг. Я следил за этой [ссылкой] (http://iphonedevsdk.com/forum/iphone-sdk-development/71147-change-disclosure-button.html) –

+0

Что должно произойти, если пользователь удаляет что-то еще во время этой «задержки около половины Второй"? –

+0

@robmayoff ничего действительно. Я думал о задержке, чтобы иметь некоторое время, чтобы пользователь мог распознать изменение изображения. –

ответ

2

Ну первым вы должны установить accessoryView вашей ячейки быть пользовательские UIView, вероятно, UIButton .. .

UIImage *uncheckedImage = [UIImage imageNamed:@"Unchecked.png"]; 
UIImage *checkedImage = [UIImage imageNamed:@"Checked.png"]; 
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; 
button.frame = CGRectMake(44.0, 44.0, image.size.width, image.size.height); 
[button addTarget:self action:@selector(tapButton:) forControlEvents:UIControlEventTouchUpInside]; 
[button setImage:uncheckedImage forState:UIControlStateNormal]; 
[button setImage:checkedImage forState:UIControlStateSelected]; 
cell.accessoryView = button; 

в вашем tapButton: метод, который вы хотите применить необходимые изменения в изображение и выполнить accessoryButtonTappedAtIndexPath. Я бы просто избежать задержек или вы можете использовать таймер отправки ...

- (void)tapButton:(UIButton *)button { 
    [button setSelected:!button.selected]; 
    UITableViewCell *cell = [button superview]; 
    NSIndexPath *indexPath = [tableView indexPathForCell:cell]; 
    [self tableView:tableView accessoryButtonTappedForRowWithIndexPath:indexPath]; 

} 
1

Согласно вашему мнению, вы уже создали свою собственную кнопку и установили ее как ячейку accessoryView.

При создании кнопки, установите его изображение для выбранного состояния к вашему галочка изображения:

[button setImage:checkmarkImage forState:UIControlStateSelected]; 

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

- (IBAction)buttonWasTapped:(id)sender event:(UIEvent *)event { 
    UIButton *button = sender; 
    button.selected = YES; 

Затем отключить взаимодействия с пользователем, так что пользователь не может сделать ничего другого во время задержки:

[[UIApplication sharedApplication] beginIgnoringInteractionEvents]; 

Получить путь индекса для ячейки, содержащей прикоснулся кнопку:

UITouch *touch = [[event touchesForView:button] anyObject]; 
    NSIndexPath *indexPath = [tableView indexPathForRowAtPoint: 
     [touch locationInView:tableView]]; 

Наконец, запланировать блок для запуска после задержки. В блоке повторного включения взаимодействия с пользователем и отправить себе сообщение, содержащее путь индекса:

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0.5 * NSEC_PER_SEC), 
     dispatch_get_main_queue(), 
    ^{ 
     [[UIApplication sharedApplication] endIgnoringInteractionEvents]; 
     [self accessoryButtonTappedForRowAtIndexPath:indexPath]; 
    }); 
} 
+0

Хорошее решение. Я бы избегал сенсорной логики, так как вы знаете, что надстройка кнопки - это ячейка. Затем вы можете просто вызвать [tableView indexPathForCell: cell], чтобы получить индексный путь. –

+0

@BenM Вы не должны полагаться на кнопку, являющуюся прямым поднабором ячейки. Это деталь реализации, которая не является частью публичного API. Существует несколько способов перехода от кнопки к ячейке, использующей только общедоступные API. Использование 'indexPathForRowAtPoint:' является коротким, простым способом. –

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