2015-03-12 3 views
2

У меня есть вид таблицы & пользовательская ячейка. ячейка содержит 3 кнопки (тип флажка). на кнопке щелкните соответствующий текст кнопок, который мне нужно изменить (отметьте/снимите флажок). Я достиг этого, но когда я нажимаю 1-ю кнопку на верхней ячейке и прокручиваю вниз, новая ячейка внизу также имеет эту галочку, и когда я прокручиваю назад, флажок перемещается в следующую ячейку. Как исправить это ??Вид прокрутки стола/dequeueReusableCell issue

код:

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

    static NSString *strCellIdentifier = @"RemoteCell"; 


    RemoteCustomCell *cell = (RemoteCustomCell*)[tableView ![dequeueReusableCell][2]WithIdentifier:strCellIdentifier]; 
    if (cell == nil) { 
     cell = [[RemoteCustomCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:strCellIdentifier]; 
    } 
    else { 
     cell = [cell initWithStyle:UITableViewCellStyleDefault reuseIdentifier:strCellIdentifier]; 
    } 

    [cell.btnCheck1 addTarget:self action:@selector(CheckButton1_Click:) forControlEvents:UIControlEventTouchUpInside];    
    } 
    return cell; 

} 


- (void)CheckButton1_Click:(UIButton*)sender 
{ 
    RemoteControllCustomCell *clickedCell = (RemoteControllCustomCell *)[[sender superview] superview]; 

    if(clickedCell.btnCheck1.selected) 
    {  
     [clickedCell.btnCheck1 setTitle:@"O" forState:UIControlStateNormal];   
     clickedCell.btnCheck1.selected = NO; 
    } 
    else 
    {  
     [clickedCell.btnCheck1 setTitle:@"X" forState:UIControlStateSelected]; 
     clickedCell.btnCheck1.selected = YES; 
    } 
} 

скриншот:

enter image description here

enter image description here

ответ

4

В файле RemoteCustomCell.m следует реализовать

- (void)prepareForReuse 
{ 
    [super prepareForReuse]; 
    cell.btnCheck1.selected = NO; 
} 

Таким образом, каждый элемент, который повторно будет иметь это значение btnCheck1.selected установлено значение NO, и когда вы загрузите ячейку в cellForRowAtIndexPath будет только установить это к YES, когда ячейка станет видимой, и вы установите ее на это.

Но это ключ для хранения всех ваших значений в NSMutableArray. Нет такой вещи, как сохранение ваших значений только в ячейках, они могут использоваться повторно на основе, которая не может быть предусмотрена. Добавьте свои значения в массив и используйте [myArray objectAtIndex:indexPath.row];, чтобы открыть эти значения в ячейке.

Пример:

Где-то в viewDidLoad

NSMutableArray *myArray = [[NSMutableArray alloc] initWithObjects:@"1", @"0", @"1", @"1", nil]; 

В вашей cellForRowAtIndexPath

BOOL yesOrNo = [[myArray objectAtIndex:indexPath.row] boolValue]; 

А затем установите button.selected в логическое значение.

1

Это типичный вопрос, где вы полагаетесь на интерфейс для работы вашей модели. Модель, вещь, которую вы должны передать на ваш UITableViewCell, чтобы она могла быть построена, сообщила бы ей, если она должна отображать «X» или «O». Поскольку вы этого не делаете, самым простым решением будет просто сбросить состояние ячейки каждый раз, когда она будет удалена.

0

Я думаю, что вам нужно сохранить состояние в массиве и проверить состояние в

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

CheckButton1_Click ли изменить состояние, но когда dequeueReusableCell, он снова загружает из cellForRowAtIndexPath.

0

Кажется, что у вас есть проблема с ячейкой. Вы можете реализовать метод cellForRowAtIndexPath, как показано ниже.

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

    static NSString *CellIdentifier = @"RemoteCell"; 
    RemoteCustomCell *cell = (RemoteCustomCell *) [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell==nil) { 
     NSArray *arrNib=[[NSBundle mainBundle] loadNibNamed:CellIdentifier owner:self options:nil]; 
     cell= (RemoteCustomCell *)[arrNib objectAtIndex:0]; 
    } 
    [cell.btnCheck1 addTarget:self action:@selector(CheckButton1_Click:) forControlEvents:UIControlEventTouchUpInside]; 
    return cell; 
} 
Смежные вопросы