Сбой во время UITableView метода moveRowAtIndexPath - PullRequest
3 голосов
/ 21 февраля 2011

У меня есть массив строк, которые я уже показываю в моем uitableview.

Когда для моего uitableview включено редактирование, я пытаюсь переместить строку, скажем, с 4-й строки на 3-ю строку, и я получаю EXC_BAD_ACCESSв объекте вставки в индексной части моего кода, когда я отлаживаю это ..

[myStringsArray insertObject:name atIndex:toIndexPath.row]; 

Однако, если я не отлаживаю, а просто собираю и запускаю, я получаю распечатать следующую строку, а затем происходит сбой безвижу EXC_BAD_ACCESS в моей консоли.

NSLog(@"re-ordered myStringsArray array");

Вот мой весь код для метода moveRowAtIndexPath:

// Override to support rearranging the table view.
- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath {
    NSArray *paths = NSSearchPathForDirectoriesInDomains( NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectoryPath = [paths objectAtIndex:0]; 
    NSString *path = [documentsDirectoryPath stringByAppendingPathComponent:@"MyStrings.plist"]; 

    //re-order array
    NSString *name = [myStringsArray objectAtIndex:fromIndexPath.row];
    [myStringsArray removeObjectAtIndex:fromIndexPath.row];
    [myStringsArray insertObject:name atIndex:toIndexPath.row];

    NSLog(@"re-ordered myStringsArray array");
    if([myStringsArray writeToFile:path atomically: YES]){NSLog(@"write succesful");}
    else {NSLog(@"write failed");}

    [myTable reloadData];
}

Любые идеи, почему он думает, что я пытаюсь получить доступ к чему-то, чего нет?

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

Спасибо

Ответы [ 4 ]

5 голосов
/ 21 февраля 2011

Когда вы удаляете объект из массива, он освобождается, поэтому есть большая вероятность того, что его счетчик сохранится до 0, и он будет освобожден.Чтобы избежать преждевременного освобождения, вы можете сохранить и освободить свой объект:

NSString *name = [[myStringsArray objectAtIndex:fromIndexPath.row] retain];
[myStringsArray removeObjectAtIndex:fromIndexPath.row];
[myStringsArray insertObject:name atIndex:toIndexPath.row];
[name release];

Или лучше использовать встроенный метод NSMutableArray для обмена найденными вами объектами:

[myStringsArray exchangeObjectAtIndex:fromIndexPath.row withObjectAtIndex:toIndexPath.row];
0 голосов
/ 25 июня 2013

в объявлении myStringsArray напишите как nsmutable arrary initwithObjects,, nil] и убедитесь, что свойство в файле .h является сильным.

0 голосов
/ 17 мая 2012

В методе TableView Delegate выполните следующее с вашим myStringArray (в качестве источника данных TableView)

 - (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath 
 {   
   NSString *name = [[myStringsArray objectAtIndex:sourceIndexPath.row] retain];
   [myStringsArray removeObjectAtIndex:sourceIndexPath.row];
   [myStringsArray insertObject:name atIndex:destinationIndexPath.row];
   [name release];
 }

И добавьте два новых делегата в ваш файл .h, как этот

- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath 
{    
  return YES;
}

- (NSIndexPath *)tableView:(UITableView *)tableView targetIndexPathForMoveFromRowAtIndexPath:(NSIndexPath *)sourceIndexPath
   toProposedIndexPath:(NSIndexPath *)proposedDestinationIndexPath 
{
  return proposedDestinationIndexPath;
}
0 голосов
/ 21 февраля 2011

Я пытался, как и вы, но это, без сомнения, приводит к сбою, потому что я думаю, что выполнение делегата может не происходить в сотрудничестве с перемещением строк пользователем, если в методе источника данных больше строк кода (из моего наблюдения).На самом деле, когда вы перемещаете строки, внешний вид означает, что только в ячейках UITableView настраиваются, но на заднем плане это данные также корректируются, поэтому есть некоторые шансы, например, когда вы перемещаете строку, она уже была перемещена, но ее ресурс данных, такой как массив илиЕсли в словаре ничего не настроено в соответствии с его перемещением, то это даст вам неправильный доступ к EXE. kk.

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

[myArray exchangeObjectAtIndex: fromIndexPath.row withObjectAtIndex: toIndexPath.row];

Используйте этот код в стороне этого метода, он будет работать без сбоев.

  • (void) tableView: (UITableView *) tableView moveRowAtIndexPath: (NSIndexPath *) изIndexPath вIndexPath: (NSIndexPath *) вIndexPath
...