cellForRowAtIndexPath продолжает падать, когда я пытаюсь добавить новую запись в UITableView? - PullRequest
0 голосов
/ 19 августа 2011

Получение ошибки: *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSNull isEqualToString:]: unrecognized selector sent to instance' ...

SIGABRT поступил в строку else cell.textLabel.text = @"Blank";:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {UITableViewCell *cell = nil;
    static NSString *CellIdentifier = @"Cell";
    cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
         cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease];
    }
     NSManagedObjectContext *context = [self managedObjectContext];
     NSEntityDescription *entity = [NSEntityDescription entityForName:@"Pattern" inManagedObjectContext:context];
 // Edit the sort method.
     NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"patternName" ascending:YES selector:@selector(localizedCaseInsensitiveCompare:)];
      NSArray *sortDescriptors = [[[NSArray alloc] initWithObjects:sortDescriptor, nil] autorelease];

     NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
     [fetchRequest setSortDescriptors:sortDescriptors];
     [fetchRequest setEntity:entity];    
     _patterns = [context executeFetchRequest:fetchRequest error:nil];
     [fetchRequest release];
     NSArray *names = [_patterns valueForKey:@"patternName"];
     NSArray *urls = [_patterns valueForKey:@"patternUrl"];

     if (names!= nil) {
        cell.textLabel.text = [names objectAtIndex:indexPath.row];           
     }
     else cell.textLabel.text = @"Blank";
     cell.detailTextLabel.text = [urls objectAtIndex:indexPath.row];
     cell.accessoryType = UITableViewCellAccessoryDetailDisclosureButton;
     return cell;
 }

Я могу добавить определенную запись (копирует URL страницы, которую просматривает пользователь, вставляя URL в поле URL и атрибуты имени). При редактировании или создании новой записи появляется ModalViewController, который представляет (для существующих записей) и захватывает данные в текстовых полях (для новых записей). Выбор сохранения сбой, изменяет только запись последней добавленной определенной записи, даже если она была отредактирована, и добавляет ее как новую запись, сохраняя старую. Я думаю, что-то не так с моим отслеживанием количества клеток.

Любые предложения будут наиболее признательны.

Ответы [ 2 ]

1 голос
/ 19 августа 2011

То, что вы получаете от executeFetchRequest, это массив объектов, а не атрибутов. Вам нужно перебрать массив объектов и получить атрибуты от каждого из них

Это

_patterns = [context executeFetchRequest:fetchRequest error:nil];
     [fetchRequest release];
     NSArray *names = [_patterns valueForKey:@"patternName"];
     NSArray *urls = [_patterns valueForKey:@"patternUrl"];

     if (names!= nil) {
        cell.textLabel.text = [names objectAtIndex:indexPath.row];           
     }

Должен стать

_patterns = [context executeFetchRequest:fetchRequest error:nil];
     [fetchRequest release];


     if (names!= nil) {
        cell.textLabel.text = [[_patterns objectAtIndex:indexPath.row] valueForKey:@"patternName"];           
     }
0 голосов
/ 19 августа 2011

Я предполагаю, что проблема на самом деле в предыдущей строке:

cell.textLabel.text = [names objectAtIndex:indexPath.row];

Я думаю, что объект, возвращаемый [names objectAtIndex: indexPath.row], является NSNull.

Попробуйте следующее:

NSString *name = nil;
if (names) {
    name = [names objectAtIndex:indexPath.row];
    if (name && name == (id)[NSNull null]) { 
        name = nil;
    }
}
if (!name) {
    name = @"Blank";
}
cell.textLabel.text = name;

РЕДАКТИРОВАТЬ: Исправлена ​​моя логика в последнем операторе if.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...