Вызов (deleteRowsAtIndexPaths) вне (commitEditingStyle) в Objective-C для iPhone - PullRequest
3 голосов
/ 12 января 2011

У меня есть пользовательский UITableViewCell, к которому добавлено два пользовательских UIButton. На одной из этих кнопок я хочу иметь возможность удалить строку ячейки из myMethod().

Метод вызывается addTarget:@selector(myMethod:) в пределах cellForRowAtIndexPath:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    ...
    cell.acceptButton.tag = indexPath.row;
    [cell.contentView addSubview:acceptButton];

    [cell.acceptButton addTarget:self action:@selector(myMethod:) forControlEvents:UIControlEventTouchUpInside];
}

Это работает, фактический метод вызывается успешно.

- (void)myMethod:(id)sender {
   NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow]; //works fine (correct indexPath is returned)
   friendsArray removeObjectAtIndex:indexPath.row]; //works fine (correct indexPath.row is returned and the object is removed from the array)
   [tv deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; //throws error below
}

Ошибка:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSArray initWithObjects:count:]: attempt to insert nil object at objects[0]'
*** Call stack at first throw:
(
 0   CoreFoundation                      0x020a9be9 __exceptionPreprocess + 185
 1   libobjc.A.dylib                     0x021fe5c2 objc_exception_throw + 47
 2   CoreFoundation                      0x01ff3ffe -[__NSPlaceholderArray initWithObjects:count:] + 494
 3   CoreFoundation                      0x020158a3 +[NSArray arrayWithObject:] + 67
 4   MyApp                          0x00071d1b -[FriendListViewController myMethod:] + 417
 5   MyApp                          0x00020b87 -[MBProgressHUD launchExecution] + 151
 6   Foundation                          0x004a3d4c -[NSThread main] + 81
 7   Foundation                          0x004a3cd8 __NSThread__main__ + 1387
 8   libSystem.B.dylib                   0x9461f85d _pthread_start + 345
 9   libSystem.B.dylib                   0x9461f6e2 thread_start + 34

Обычно я делал бы это при удалении строки в ячейке. Это отлично работает:

- (void)tableView:(UITableView *)tableview commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
 if(editingStyle == UITableViewCellEditingStyleDelete) {
  //Delete the object from the friends array and the table.
  [friendsArray removeObjectAtIndex:indexPath.row];
  [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
 }
}

Ответы [ 2 ]

0 голосов
/ 12 января 2011

Проблема в инициализации массива, а не в удалении строки. Попробуйте отладить этот метод еще раз и проверьте, может ли indexPath быть nil.

0 голосов
/ 12 января 2011

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

Я сделал это, когда хочу поменять цвет кнопок со своими аксессуарами на зеленый (я не знаю, позволит ли это Apple или нет, но я просто хочу попробовать). поэтому сделал пользовательскую кнопку и изменил ее фоновое изображение на зеленый, а затем в accessoryView я добавил эту кнопку. И это работало просто отлично. Вам необходимо установить тег в tableView:cellForRowAtIndexPath: method

...