У меня есть UIPickerView
внутри контроллера представления, который реализует -(UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view
IOS, UIPickerView с UITableViewCell
Я использовал UITableViewCell
, чтобы использовать accessoryType
, UITableViewCellAccessoryCheckmark
. У меня возникли проблемы формулировки процесса общего контроллера представления, так что я буду использовать код:
-(UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view{
UITableViewCell *cell = (UITableViewCell *)view;
if(cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil];
[cell setBackgroundColor:[UIColor clearColor]];
if([[[self.currentData objectAtIndex:row] valueForKey:@"uuid"] isEqualToString:self.currentProfile] || [[[self.currentData objectAtIndex:row] valueForKey:@"description"] isEqualToString:self.currentSelectedRow]){
[cell setAccessoryType:UITableViewCellAccessoryCheckmark];
cell.tag = 10;
self.Switch.on = TRUE;
}
[cell setBounds: CGRectMake(0, 0, cell.frame.size.width -20 , 44)];
cell.textLabel.text = [[self.currentData objectAtIndex:row] valueForKey:@"description"];
return cell;
}
UITapGestureRecognizer
на UIPickerView
называет это:
-(void)pickerTapped:(UITapGestureRecognizer *) sender{
CGPoint touchPoint = [sender locationInView:self.view];
CGRect frame = self.pick.frame;
CGRect selectFrame = CGRectInset(frame, 0.0, self.pick.bounds.size.height * 0.85/2.0);
//if the tap gesture is onto of the picker view, & the enabled switch is on
if(CGRectContainsPoint(selectFrame, touchPoint) && self.Switch.on){
//clear all cells of check mark
for(int i = 0; i < [self.pick numberOfRowsInComponent:0]; i++){
UITableViewCell *tmpCell = (UITableViewCell *) [self.pick viewForRow:i forComponent:0];
tmpCell.accessoryView = UITableViewCellAccessoryNone;
}
[self.pick reloadAllComponents];
UITableViewCell *cell = (UITableViewCell *)[self.pick viewForRow:[self.pick selectedRowInComponent:0] forComponent:0];
self.currentSelectedRow = cell.textLabel.text;
if(cell.tag == 10){
//user tapped on already ticked cell, wishes to untick
cell.accessoryType = UITableViewCellAccessoryNone;
cell.tag = 0;
self.currentSelectedRow = nil;
} else{
//user has selected un-ticked row, wishes to tick
//clear all cells of tags
for(int i = 0; i < [self.pick numberOfRowsInComponent:0]; i++){
UITableViewCell *tmpCell = (UITableViewCell *) [self.pick viewForRow:i forComponent:0];
tmpCell.tag = 0;
}
//assign new ticked cell & update currentProfile
cell.accessoryType = UITableViewCellAccessoryCheckmark;
cell.tag = 10;
self.currentProfile = [[self.currentData objectAtIndex:[self.pick selectedRowInComponent:0]] valueForKey:@"uuid"];
}
}
//[self.pick reloadAllComponents]; <-- this is a key part. take note.
}
Heres вопрос:
Общая цель этого заключается в том, что пользователь может не иметь ни одного тика, ни одной строки, отмеченной в любой момент. Если контроллер представления загружается &, то текущий профиль установлен, то есть представляет собой представление существующих данных. то связанная строка галочка.
Простой. Тем не менее ...
[self.pick reloadAllComponents]
в нижней части сборщика. Функция: при отсутствии раскопок в представлении выбора может обрабатываться не, или только 1 строка, отмеченная галочкой. но неспособность обрабатывать выбор строки/untick.
Когда одна и та же строка прокомментирована, сборщик способен обрабатывать не выбранные строки, но ведет себя странно с одной выбранной строкой. я могу выбрать & отменить выделение строки, однако, когда я выбираю другую строку, аксессорный тип обновляется для ячейки в поле «выбор» в представлении выбора (две строки посередине), но когда я просматриваю на сборщике , соответствующая ячейка отображается так, как если бы аксессуар не обновлялся. Чтобы уточнить, когда я прокручиваю ячейку обратно в «поле выбора», она кажется прекрасной, как следует.