2013-06-26 2 views
-2

Я делаю телефонную книгу.Как создать UITableView, полный UITableViewCells, каждый с UISwitch?

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

Как это создать, чтобы UISwitch сохранял статус переключения даже во время прокрутки? dequeueReusableCellWithIdentifier дает мне много проблем в том, что он не сохраняет togglestate из UISwitches.

Хотя я люблю экономию памяти, переключая переключатели внутри cellForRowAtIndexPath (в соответствии с логическим значением конфиденциальности для контакта) не работает, чтобы всегда показывать публичный/частный статус контакта.

См скриншот ниже того, что я пытаюсь построить:

enter image description here

EDIT: Вот мой cellForRowAtIndexPath:

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

    AHBContact *thisContact = nil; 

    AHBBrowseContactCell *cell =[tableView dequeueReusableCellWithIdentifier:@"BROWSECELL"]; 

    // from contacts list 
    thisContact = [self.contacts[indexPath.section] allValues][0][indexPath.row]; 

    cell.customPublicSwitch.onTintColor = [AHBUtilities greenColor]; 
    cell.customPublicSwitch.onText= @"Public"; 
    [email protected]"Private"; 

    if(thisContact.privacy){ 
     NSLog(@"public %@",thisContact.fullName); 
     cell.customPublicSwitch.on = YES; 

    } 
    else{ 
     NSLog(@"private %@", thisContact.fullName); 

     cell.customPublicSwitch.on = NO; 

    } 

    cell.labelName.text = thisContact.fullName; 
    cell.labelName.font = [AHBUtilities regularFontWithSize:cell.labelName.font.pointSize]; 
    cell.imageViewIcon.image = [AHBIcons phoneIconForCategory:thisContact.category]; 

    cell.textLabel.backgroundColor = [UIColor clearColor]; 
    cell.backgroundColor = [UIColor colorWithWhite:1 alpha:0.55]; 

    return cell; 
} 

ВТОРОЙ EDIT: Вот мой метод "togglePublic", который работает на «valueChanged» переключателя

-(IBAction)togglePublic:(UIControl *)button withEvent:(UIEvent *)event { 

     DCRoundSwitch *switch1 = (DCRoundSwitch *)button; 
     UITableViewCell *cell = (UITableViewCell *)switch1.superview; 
     NSIndexPath *indexPath = [self.tableview indexPathForCell: cell.superview]; 

     if (indexPath == nil){ 

      return; 

     } 

     AHBContact *contact = [self.contacts[indexPath.section] allValues][0][indexPath.row]; 

     contact.privacy = !contact.privacy; 

     NSLog(@"Public switch toggled for: %@", contact.firstName); 

     [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES]; 

[[AHBContactsController sharedController] updateContact:contact completion:^(id result) { 

     [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO]; 


      NSLog (@"Public/Private updated%@",result); 


     } failure:^(NSError *error) { 

      [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO]; 

      UIAlertView *message = [[UIAlertView alloc] initWithTitle:@"Sync Problem" 
                  message:@"Could save changes. Please try again." 
                  delegate:self 
                cancelButtonTitle:@"Ok" 
                otherButtonTitles:nil]; 
      [message show]; 



     }]; 

    } 
+0

Настройка состояния переключателя в 'cellForRow ...' является допустимым подходом. Если он не работает, вы делаете что-то неправильно. Отправьте свой метод cellForRow .... – rmaddy

+0

@rmaddy просто добавил изменения - дайте мне знать, что вы думаете! – Rohan

+0

Код отображается правильно. Возможно, проблема связана с изменением значения переключателя. У вас есть код, который отвечает на изменение коммутатора пользователем, а затем обновляет запись 'AHBContact' с новым значением? – rmaddy

ответ

0

Попробуйте установить его в методе делегата

- (void)tableView:(UITableView *)tableView willDsiplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { 
    UISwitch *switch = cell.yourCellSwitch; 
    switch.on = yourSwitchVariable; 
} 
+0

просто попробовал это, не работал, когда я просматриваю. В принципе, коммутатор переключается, но тогда этот коммутатор/ячейка случайным образом повторно используется другими ячейками (которые теперь показывают неправильную общедоступную/личную информацию в результате). – Rohan

0

Возможно, переключатель, который вы создаете в cellForRowAtIndexPath: проблема. Попробуйте сделать так. Создайте пользовательскую ячейку с UILabel и UISwitch. Сделайте эти IBOutlets и свойство настраиваемой ячейки и соедините их. Теперь в cellForRowAtIndexPath: метод использует пользовательскую ячейку вместо вашей ячейки по умолчанию. Поскольку клетка в настоящее время повторного использования, и этот метод вызывается каждый раз, когда клетка становится видимой на экране, я предполагаю, что происходит несоответствие, как вы создаете UISwitch каждый раз, а затем назначить его состояние

static NSString *cellIdentifier = @"CellIdentifier"; 

     YourCustomCell *cell = (YourCustomCell*)[tableView dequeueReusableCellWithIdentifier:cellIdentifier]; 
     if (!cell) 
     { 
      NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"YourCustomCell" owner:self options:nil]; 
      for (id currentObject in topLevelObjects){ 
       if ([currentObject isKindOfClass:[UITableViewCell class]]){ 
        cell = (YourCustomCell *) currentObject; 
        break; 
       } 
      } 
     } 

     // from contacts list 
      thisContact = [self.contacts[indexPath.section] allValues][0][indexPath.row]; 
    if(thisContact.privacy){ 
      NSLog(@"public %@",thisContact.fullName); 
      cell.customPublicSwitch.on = YES; 

     } 
     else{ 
      NSLog(@"private %@", thisContact.fullName); 

      cell.customPublicSwitch.on = NO; 

     } 

     cell.labelName.text = thisContact.fullName; 
     cell.labelName.font = [AHBUtilities regularFontWithSize:cell.labelName.font.pointSize]; 
     cell.imageViewIcon.image = [AHBIcons phoneIconForCategory:thisContact.category]; 
     cell.textLabel.backgroundColor = [UIColor clearColor]; 
     cell.backgroundColor = [UIColor colorWithWhite:1 alpha:0.55]; 
    return cell; 
} 

Надеется, что это помогает:)

+0

Просто попробовал это, похоже, не работает для меня - такая же проблема, даже если Я удаляю «AHBBrowseContactCell * cell = (AHBBrowseContactCell *) [tableView dequeueReusableCellWithIdentifier: cellIdentifier]; « полностью.Это даже не dequeueing, и ячейки все еще перепутались (но на этот раз они просто получают сброс только к состоянию по умолчанию)! Как это возможно?? Кроме того, я замечаю, что настройка UISwitch на (setOn) вызывает «valueChanged» и запускает обновление ... может ли это быть проблемой? – Rohan

+0

Можете ли вы вставить свой текущий код. Я не могу сказать вам точную причину, не глядя на код – Meera