2012-01-18 2 views
0

У меня есть табличное представление с большим количеством записей, разделенных на несколько разделов и внутри которых у меня есть несколько строк. У меня есть кнопка, смоделированная как флажок в каждой строке. Флажки (кнопки) могут быть активированы/деактивированы при нажатии. Я загружаю изображение на кнопке (флажок) в зависимости от статуса, независимо от того, установлен он или нет. Все идет хорошо, пока я не попытаюсь перетащить UITableview вниз, а затем поднимусь, только чтобы автоматически отключить некоторые из моих отмеченных флажков. Я вроде понял, что это было вызвано из-за использованияСостояние флажка изменяется, когда uitableview прокручивается вверх и вниз

dequeuereusablecellwithidentifier 

Я хочу, чтобы избежать этого странного поведения моего Tableview. Нужна помощь в этом случае.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
static NSString *CellIdentifier = @"Cell"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
if (cell == nil) { 
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease]; 
    UIButton *checkBox = [[UIButton alloc] init]; 
    checkBox.tag = contact.contactID; 
    [cell.contentView addSubview:checkBox]; 
    [checkBox setFrame:CGRectMake(6,14,20,20)]; 
    [checkBox release]; 
} 
UIButton *checkBox = (UIButton *)[cell.contentView viewWithTag:contact.contactID]; 

if(isActivDeactivButton) 
{ 
    [checkBox setImage:[UIImage imageNamed:@"disabled_checkbox.png"] forState:UIControlStateNormal]; 
    } 
else{ 
    [checkBox setImage:[UIImage imageNamed:@"selected_checkbox.png"] forState:UIControlStateNormal]; 
} 
return cell; 
} 

ответ

0

Я заменил

checkBox.tag = contact.contactID; 

с

checkBox.tag = 111; 

Это решило проблему, как мои ценности ContactId изменялись во время прокрутки.

2

Убедитесь, что логика -tableView:cellForRowAtIndexPath: устанавливаются следующим образом:

// Customize the appearance of table view cells. 
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = @"Cell"; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     // this part is called when the cell is created anew 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 
     // add new components here (this is where you'd add your checkbox control, etc) 
    } 

    // change the state of components here (this is where you'd make sure your checked property is set correctly 

    return cell; 
} 

Использование dequeueReusableCellWithIdentifier: является большой практикой для управления памятью, так что вы хотите, чтобы это точно.

+0

Я добавил свой код к вопросу. –

+0

Это ВСЕ ваш код? Я не вижу, откуда пришел «контакт», «isActivDeactivButton». – Tim

+0

Добавьте 'NSLog (@" Загрузка ячейки в строке% d ", indexPath.row);' к вашему коду, а затем просмотрите вывод при прокрутке - это поможет вам лучше понять, когда он вызывает метод и поможет вам понять, почему он не устанавливает его должным образом. – Tim

2
// Add following methods def in viewController .h 

    -(void)checkButtonPressed:(id)sender; 
    -(void)addSelectedCheckBoxTag:(int)value; 
    -(void)deleteSelectedCheckBoxTag:(int)value; 
    -(BOOL)isSelectedCheckBox:(int)value; 

// add target to the check button in cellForRowAtIndexPath - 

    [checkBox addTarget:self action:@selector(checkButtonPressed:) forControlEvents:UIControlStateNormal]; 

// Ad following methods in viewController .m where tabelView 

    -(void)checkButtonPressed:(id)sender 
    { 
    UIButton *checkBox=(UIButton*)sender; 
    if(checkBox.selected) 
    { 
    checkBox.selected=false; 
    [checkBox setImage:[UIImage imageNamed:@"disabled_checkbox.png"] forState:UIControlStateNormal]; 
    [self deleteSelectedCheckBoxTag:checkBox.tag]; 
    NSLog(@"unselected .."); 
    } 
    else 
    { 
    checkBox.selected=true; 
    [self addSelectedCheckBoxTag:checkBox.tag]; 
    [checkBox setImage:[UIImage imageNamed:@"selected_checkbox.png"] forState:UIControlStateNormal];  
    NSLog(@"selected.."); 
    }  

} 

    // Add element in to array if already present forget 

    -(void)addSelectedCheckBoxTag:(int)value 
    { 
     int flag=0; 

    for(int i=0;i<[arrayForTag count];i++) 
    {   
     if([[arrayForTag objectAtIndex:i] intValue]==value) 
     flag=1; 
    } 
    if(flag==0) 
    [arrayForTag addObject:[NSString stringWithFormat:@"%d",value]]; 
    } 

    // delete element add in array if present 

    -(void)deleteSelectedCheckBoxTag:(int)value 
    { 

    for(int i=0;i<[arrayForTag count];i++) 
    {   
     if([[arrayForTag objectAtIndex:i] intValue]==value) 
     [arrayForTag removeObjectAtIndex:i]; 
    } 
    } 

    // For take is selected or not from array - 

-(BOOL)isSelectedCheckBox:(int)value 
    { 
    for(int i=0;i<[arrayForTag count];i++) 
    {   
     if([[arrayForTag objectAtIndex:i] intValue]==value) 
     return true; 
     } 
    return false; 
    } 

    // In cellForRowAtIndexPath replace following code 

    if(isActivDeactivButton) 
     { 
     [checkBox setImage:[UIImage imageNamed:@"disabled_checkbox.png"] forState:UIControlStateNormal]; 
     } 
else{ 
    [checkBox setImage:[UIImage imageNamed:@"selected_checkbox.png"] forState:UIControlStateNormal]; 
    } 

    // with following code - 

    if(![self isSelectedCheckBox:checkBox.tag]) 
    { 
     [checkBox setImage:[UIImage imageNamed:@"disabled_checkbox.png"] forState:UIControlStateNormal]; 
    } 
    else{ 
     [checkBox setImage:[UIImage imageNamed:@"selected_checkbox.png"] forState:UIControlStateNormal]; 
     } 
+0

Это был очень сложный и информативный ответ. Спасибо брат. –

+0

Подробный ответ. Работал и для меня. благодаря –

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