2014-08-08 2 views
1

У меня есть UIButton в каждом из моих UITableViewCell. Когда кнопка нажата, я отключу ее, чтобы пользователь не мог ее снова нажать (это напоминает кнопку). Однако, когда пользователь прокручивает пропущенную ячейку, а свитки возвращаются в ячейку, кнопка выбирается еще раз. Я предполагаю, что это происходит потому, что ячейка перерисовывается, когда пользователь возвращается к ней, перезагружая кнопку. Есть ли способ избежать этого? Мой код нижеОтключение UIButton в UITableViewCell с возможностью повторного использования ячеек

Код

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    NSString *CellIdentifer = @"cellName"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifer]; 

    if (cell == nil) 
    { 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifer]; 
    } 
    UIButton *ilikeit = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 
    [ilikeit addTarget:self action:@selector(like:) forControlEvents:UIControlEventTouchUpInside]; 
    ilikeit.frame = CGRectMake(55, h+70, 45, 25); 
    [cell addSubview:ilikeit]; 
    return cell; 
} 

-(void) like:(id) sender { 
    ((UIButton *)sender).enabled = NO; 
} 
+2

Вам нужно сохранить * состояние * в объекте модели данных datasource. – Droppy

+0

добавьте меня в skype (amir.ios), чтобы принять код. Я исправил вашу проблему –

ответ

0

Problem- 1 Вы создаете ваш кнопку каждый раз, когда cellForRowAtIndexPath будет вызываться. Problem- 2 У вас нет кода для сохранения состояния вашей кнопки с возможностью повторного использования соты, поэтому она обновляется, когда ячейка собирается повторно использовать.

Solution- Для этого вам необходимо сохранить выбранную вами кнопку. Сделайте глобальную переменную NSInteger. И установите его значение как sender.tag значение в like: метод. И использование -

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if (cell == nil) 
    { 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifer]; 

    // here create your UIButton 
    // Set its tag to indexPath.row 
    // add this to cell as subview 
    } 

    // find button of current cell using tag 
    UIButton *btn = (UIButton*)[cell.contentView viewWithTag:indexPath.row]; 
    // place your check here if button tag matches with selected tag then disable btn here. 
    // Else use setEnable with YES parameter. 
} 
1

Вы можете сохранить состояние кнопки в своей модели данных для класса tableview.

Произнесите TableView загружается данных из класса MyData, который выглядит следующим образом:

@interface MyData: NSObject 

    // Your other data here such as strings etc 
    NSString *otherData; 
    // Here add a selected flag 
    BOOL selected; 

@end 

в TableViewDelegate, читать и писать на эту модель.

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ 
    MyData *thisCellData = [yourGlobalMyDataArray objectAtIndex:indexPath.row]; 
    // set other data 
    if (thisCellData.selected){ 
      // Hide the button 
      // Do other stuff as needed for this button 
    } 
    else { 
      // Show the button 
      // Do other stuff as needed for this button 

    } 
} 

Одну и ту же модель данных следует обновлять, когда пользователь выбирает кнопку.

Надеюсь, это поможет.

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