Кнопка «Удалить» в ячейке uitableview не работает должным образом

Я показываю комментарии в UItableView и создал кнопку удаления в ячейке. Когда я удаляю любой комментарий, он удаляется. и я использовал [Tableview reloadData], но он всегда удаляет последнюю ячейку из таблицы, и когда я проверяю удаленный комментарий в следующий раз, все в порядке. Почему представление таблицы всегда удаляет последнюю ячейку. Мой код

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

   NSString *CellIdentifier = [NSString stringWithFormat:@"Cell%i",indexPath.row];

   UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

   if (cell == nil) {
                    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease];


       //delete button in uitableview cell ================================

         deleteBtn = [UIButton buttonWithType:UIButtonTypeCustom];

         deleteBtn.frame = CGRectMake(270, 10, 20, 20);

          //[deleteBtn setTitle:@"delete" forState:UIControlStateNormal];

          [deleteBtn setImage:[UIImage imageNamed:@"deletefb.png"] forState:UIControlStateNormal];
          deleteBtn.tag = indexPath.row;

          [deleteBtn addTarget:self action:@selector(delete:) forControlEvents:UIControlEventTouchUpInside];
                    deleteBtn.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin;

           [cell.contentView addSubview:deleteBtn];

            }

            return cell;

    }  

Метод удаления

- (void )delete:(id)sender {


    UIButton *myDeleteButton = (UIButton *)sender ;




    //delete method of comment

    NSMutableDictionary *variables = [NSMutableDictionary dictionaryWithCapacity:1];

    [variables setObject:@"delete" forKey:@"method"];


    [fbGraph doGraphPost:[NSString stringWithFormat:@"%@",[(Facebook *)[tableArray objectAtIndex:myDeleteButton.tag]postId]] withPostVars:variables];


     //load tableview 
    [self responseMethod];  //method to load comments
    //show alert
    UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"Deleted"
                                                   message:@"" delegate:nil
                                         cancelButtonTitle:@"Ok" otherButtonTitles:nil ];

    [alert show];
    [alert release];







}

person iProgrammer    schedule 11.07.2011    source источник


Ответы (1)


Попробуйте переместить deleteBtn.tag = indexPath.row; за пределы условия if (cell == nil).

В вашей текущей настройке, когда вы повторно используете ячейку, а не создаете новую, tag будет ссылаться на старую indexPath.row, а не на новую. Возможно, именно поэтому вы видите, что ячейки удалены не так, как ожидалось.

if (cell == nil) {
    // Do you other stuff here         
}
deleteBtn.tag = indexPath.row;
return cell;

Кроме того, вы, похоже, не понимаете концепцию повторного использования ячеек таблицы. Идентификатор должен быть постоянной строкой, применяемой ко всем ячейкам, а не динамической, как вы установили здесь. Например

NSString *identifier = @"someUniqueValue";
person Community    schedule 11.07.2011
comment
Я использовал deleteBtn.tag = indexPath.row снаружи, но все равно удаляет последнюю строку - person iProgrammer; 11.07.2011
comment
NSString *идентификатор = @someUniqueValue; Я также использовал это. Но значение моей ячейки таблицы перемещается в первую ячейку и обменивается друг с другом - person iProgrammer; 11.07.2011
comment
Вы уверены, что это на самом деле удаление последней строки, или потому что вы повторно запрашиваете источник данных, который теперь имеет на один результат меньше, табличное представление просто отображает на одну запись меньше? Это создаст иллюзию удаления последней строки, хотя на самом деле это не так. Немного сложно точно определить, что происходит, поскольку вы, похоже, не удаляете ячейки типичным способом. - person ; 11.07.2011
comment
на самом деле, когда я удаляю любую ячейку. Всегда исчезает последняя ячейка. Я не знаю, это удаление или что? - person iProgrammer; 11.07.2011
comment
@IphoneDeveloper Я не уверен, что вы имеете в виду, когда значение вашей ячейки перемещается в первую ячейку, поскольку нигде в приведенном выше коде вы не устанавливаете значение ячейки. Если вы устанавливаете его, но пропустили, то он также должен выйти за пределы условия if (cell == nil). Единственные вещи, которые должны находиться внутри этого состояния, являются общими для всех ячеек. Вещи, относящиеся к отдельным ячейкам (такие как значения, теги и т. д.), должны выходить за рамки условия. - person ; 11.07.2011
comment
Я создал метку в if (cell == nil) {}, и если мой массив таблиц имеет большое значение, а таблица прокрутки вниз, значения, появившиеся в последней ячейке, также появятся в первой ячейке ... после прокрутки. - person iProgrammer; 11.07.2011
comment
пожалуйста, скажите мне правильный путь .. где я должен создавать ярлыки? - person iProgrammer; 11.07.2011
comment
@IphoneDeveloper Но вы, похоже, на самом деле не удаляете какие-либо строки, вместо этого вы удаляете комментарий из FaceBook, а затем повторно запрашиваете комментарии и отображаете их; поэтому всегда будет на единицу меньше, чем до удаления, и будет казаться, что удалена последняя строка, хотя на самом деле это не так. - person ; 11.07.2011
comment
эй, большое спасибо .. Я создаю все ярлыки и кнопки снаружи, если (ячейка == ноль), и это работает нормально ... :) - person iProgrammer; 11.07.2011
comment
@IphoneDeveloper Самый эффективный способ — создать метку внутри if (cell == nil), но убедитесь, что вы установили ее значение снаружи - person ; 11.07.2011
comment
ok означает, что я должен выделить его в условии if и назначить его снаружи. Спасибо. - person iProgrammer; 11.07.2011
comment
@IphoneDeveloper Да. Создавайте и размещайте любые представления внутри, назначайте любые значения снаружи. - person ; 11.07.2011
comment
@IphoneDeveloper Внутри. Если вы создаете представления снаружи и добавляете их в ячейку, вы будете делать это каждый раз, когда ячейка будет повторно использоваться, а это означает, что сверхурочные ячейки будут создавать огромное количество неиспользуемых подпредставлений, которые будут занимать память и в конечном итоге замедлять ваше приложение. Если вы создаете и добавляете их внутрь, вы делаете это только один раз при создании экземпляра ячейки. Затем каждый раз, когда вы повторно используете ячейку, вы просто устанавливаете значения. - person ; 11.07.2011