2015-01-14 7 views
1

Создаю табличный вид, и все работает нормально. Я хочу всегда отображать 1 ячейку в моем представлении таблицы с заголовком «Вы должны добавить ячейку». Затем, когда я добавляю информацию в свой массив (tableData), мне нужно отобразить эту информацию в моей пользовательской ячейке. Затем, когда я удаляю эту ячейку, мне нужно отобразить мою 1 ячейку с названием «Вы должны добавить ячейку». Но я не могу это сделать (Пожалуйста, объясните мне, почему?)Попробуйте удалить UITableViewCell

Мой код:

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    _tableData = [[NSMutableArray alloc] init]; 
    [self.tableView setDelegate:self]; 
    [self.tableView setDataSource:self]; 

    self.tableData = [NSMutableArray arrayWithArray:[[SOCoreDataManager sharedManager] getAllAims]]; 

} 

- (NSInteger)tableView:(UITableView *)tableView 
numberOfRowsInSection:(NSInteger)section 
{ 

    if ([self.tableData count] == 0) { 
     return 1; 
    } 

    return [self.tableData count]; 
} 

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

static NSString* cellID = @"cellForMyAims"; 

if ((int)[self.tableData count] == 0) { 
    static NSString* cellIDw = @"Cell"; 
    UITableViewCell *cellw = [table dequeueReusableCellWithIdentifier:cellIDw]; 

    if (!cellw) { 
     cellw = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellIDw]; 
    } 
    cellw.backgroundColor = [UIColor orangeColor]; 
    return cellw; 

} else { 

    CellForMyAimsTableViewCell *cell = [table dequeueReusableCellWithIdentifier:cellID]; 

    if (!cell) { 
     cell = [[CellForMyAimsTableViewCell alloc] initWithFrame:CGRectZero];; 
    } 

    return cell; 
} 

}

И я удаляю:

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { 
    if (editingStyle == UITableViewCellEditingStyleDelete) { 

     SOGoal *goal = self.tableData [indexPath.row]; 

      [[SOCoreDataManager sharedManager] deleteAim:goal]; 

      self.tableData = [NSMutableArray arrayWithArray:[[SOCoreDataManager sharedManager] getAllAims]]; 

      [self.tableView beginUpdates]; 
      [self.tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationLeft]; 
      [self.tableView endUpdates]; 

    } 

} 

Ошибка:

2015-01-14 15:17:25.019 [5332:190142] *** Assertion failure in -[UITableView _endCellAnimationsWithContext:], /SourceCache/UIKit_Sim/UIKit-3318.16.14/UITableView.m:1582 
2015-01-14 15:17:25.022 [5332:190142] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Invalid update: invalid number of rows in section 0. The number of rows contained in an existing section after the update (1) must be equal to the number of rows contained in that section before the update (1), plus or minus the number of rows inserted or deleted from that section (0 inserted, 1 deleted) and plus or minus the number of rows moved into or out of that section (0 moved in, 0 moved out).' 
*** First throw call stack: 
(
    0 CoreFoundation      0x00000001050bcf35 __exceptionPreprocess + 165 
    1 libobjc.A.dylib      0x0000000104d55bb7 objc_exception_throw + 45 
    2 CoreFoundation      0x00000001050bcd9a +[NSException raise:format:arguments:] + 106 
    3 Foundation       0x00000001049725df -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 195 
    4 UIKit        0x000000010337bc2a -[UITableView _endCellAnimationsWithContext:] + 11746 
    5 nameapp        0x00000001029777cf __69-[ListViewController tableView:commitEditingStyle:forRowAtIndexPath:]_block_invoke + 607 
    6 nameapp        0x000000010297ea10 __86+[SONetworkingWithLegendaryServer deleteAim:legendaryToken:aimId:onSuccess:onFailure:]_block_invoke + 112 
    7 nameapp        0x000000010296dad8 __64-[AFHTTPRequestOperation setCompletionBlockWithSuccess:failure:]_block_invoke46 + 40 
    8 libdispatch.dylib     0x0000000106673ba6 _dispatch_call_block_and_release + 12 
    9 libdispatch.dylib     0x00000001066917f4 _dispatch_client_callout + 8 
    10 libdispatch.dylib     0x000000010667a8fb _dispatch_main_queue_callback_4CF + 949 
    11 CoreFoundation      0x0000000105024fe9 __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 9 
    12 CoreFoundation      0x0000000104fe7eeb __CFRunLoopRun + 2043 
    13 CoreFoundation      0x0000000104fe7486 CFRunLoopRunSpecific + 470 
    14 GraphicsServices     0x00000001070569f0 GSEventRunModal + 161 
    15 UIKit        0x00000001032a7420 UIApplicationMain + 1282 
    16 nameapp        0x00000001029c52e3 main + 115 
    17 libdyld.dylib      0x00000001066c6145 start + 1 
) 
libc++abi.dylib: terminating with uncaught exception of type NSException 
+2

Каков результат этого кода? Ошибка? Неожиданный результат? Что-то другое? – Reti43

+0

Вы пробовали [self.tableView reloadData]; просто после добавления ячейки? – Miknash

+0

Ошибка говорит, что она думает, что что-то не так с вашей арифметикой. У вас был один элемент таблицы, его удалил и все еще есть один элемент. Я не уверен в исправлении ... возможно, используйте 'if ([self.tableData count] == ​​0)', чтобы решить, следует ли вставлять специальную строку при совершении редактирования. Затем вам нужно будет определить, какой тип ячейки следует вернуть, когда счетчик равен 1, проверив тип элемента, который был в 'self.tableView'. –

ответ

3

Вы получаете NSInternalInconsistencyException, потому что ваша таблица всегда будет иметь хотя бы одну строку, но когда вы проведите пальцем по последней строке, о которой вы говорите, вы ожидаете, что в итоге вы получите 0 ячеек. Это очевидное несоответствие генерирует исключение.

Чтобы исправить это, tableView:commitEditingStyle:forRowAtIndexPath: необходимо проверить для случая «Пользователь удалил последнюю строку» и обработать его по-разному. Когда вы в последний ряд, у вас есть два варианта:

  1. ReFRESH существующий путь индекса (он должен преобразовать в заполнителем ячейки):

    [self.tableView beginUpdates]; 
    [self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationLeft]; 
    [self.tableView endUpdates]; 
    
  2. Удалить ячейку пользователя и вставки заполнитель клетки:

    [self.tableView beginUpdates]; 
    [self.tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationLeft]; 
    [self.tableView insertRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:0 inSection:0]] withRowAnimation:UITableViewRowAnimationLeft]; 
    [self.tableView endUpdates]; 
    
+0

Спасибо, теперь он отлично работает). Я также думаю, что xcode считает, что у меня нет ячейки, а не в numberForRows, я сказал, что у меня есть один! И вот почему была ошибка. Но я действительно не знаю, что делать. Я пытаюсь добавитьObject в таблицу table, когда count == 0, и это не работает ( ) –

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