2015-03-11 3 views
0

У меня есть UIPickerView внутри контроллера представления, который реализует -(UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)viewIOS, 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.

Когда одна и та же строка прокомментирована, сборщик способен обрабатывать не выбранные строки, но ведет себя странно с одной выбранной строкой. я могу выбрать & отменить выделение строки, однако, когда я выбираю другую строку, аксессорный тип обновляется для ячейки в поле «выбор» в представлении выбора (две строки посередине), но когда я просматриваю на сборщике , соответствующая ячейка отображается так, как если бы аксессуар не обновлялся. Чтобы уточнить, когда я прокручиваю ячейку обратно в «поле выбора», она кажется прекрасной, как следует.

ответ

0

Awkwardly удалось решить это вскоре после публикации.

Содс закон & все, что

На pickerTapped:, где currentSelectedRow = nil, self.currentProfile также должен быть установлен в ноль. reloadAllComponents должен быть незанятым