Продолжайте получать ошибку sigabrt с основными данными - PullRequest
1 голос
/ 02 сентября 2011

В данный момент я изучаю основные данные и работаю над простой версией учебника по основным данным Apple (Местоположения).

Ниже приведен код для метода addEvent:

Event *event = (Event *)[NSEntityDescription insertNewObjectForEntityForName:@"Event" inManagedObjectContext:managedObjectContext];
[event setCreationDate:[NSDate date]];


NSError *error;
if (![managedObjectContext save:&error]) {
    // Handle the error.
}


[eventsArray insertObject:event atIndex:0];
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0];
[self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
[self.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:YES];

Когда этот метод запущен, я получаю ошибку sigabrt. Однако я обнаружил, что, если я включаю код Apple ViewDidLoad, ошибка больше не возникает, и я не могу понять, почему?

Вот код, который останавливает возникновение ошибки:

- (void)viewDidLoad {

[super viewDidLoad];

// Set the title.
self.title = @"Locations";

// Configure the add and edit buttons.
self.navigationItem.leftBarButtonItem = self.editButtonItem;

addButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(addEvent)];
self.navigationItem.rightBarButtonItem = addButton;



/*
 Fetch existing events.
 Create a fetch request; find the Event entity and assign it to the request; add a sort descriptor; then execute the fetch.
 */

NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Event" inManagedObjectContext:managedObjectContext];
[request setEntity:entity];

// Order the events by creation date, most recent first.
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"creationDate" ascending:NO];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
[request setSortDescriptors:sortDescriptors];
[sortDescriptor release];
[sortDescriptors release];

// Execute the fetch -- create a mutable copy of the result.
NSError *error = nil;
NSMutableArray *mutableFetchResults = [[managedObjectContext executeFetchRequest:request error:&error] mutableCopy];
if (mutableFetchResults == nil) {
    // Handle the error.
}

// Set self's events array to the mutable array, then clean up.
[self setEventsArray:mutableFetchResults];
[mutableFetchResults release];
[request release];

Что мне не хватает? Я не вижу, как отсутствие запроса на выборку для viewDidLoad вызывает ошибку

Спасибо

Ответы [ 2 ]

1 голос
/ 17 ноября 2011

У меня была такая же проблема при работе с учебником Apple.

Проходя через отладчик, он падает на строку

[self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];

на - (void)addEvent в RootViewController.m

Причина, по которой код на исходных плакатах предотвращает возникновение ошибки, заключается в том, что строка, в которой запускается диспетчер местоположений, отсутствует в - (void) viewDidLoad.

[[self locationManager] startUpdatingLocation]

Таким образом, когда срабатывает

-(void)addEvent 

, процедура выполняет возврат и выход

if (!location) {
    return;
}

и поэтому неДобравшись до строки с ошибками, я добавил startUpdatingLocation обратно к viewDidLoad исходного кода постеров, и ошибка sigabrt вернулась снова.

Я знаю, что это не ответ, но я надеюсь, что это спасет кого-то еще половинучас.

1 голос
/ 02 сентября 2011

Как ваш табличный вид узнает, какие события показывать?

Одним из побочных эффектов метода Apple viewDidLoad является то, что он создаст массив событий. Если вы никогда не создаете это, но говорите своему tableView, что вы вставили строку, вам лучше иметь эту строку доступной!

Вы звоните

[eventsArray insertObject:event atIndex:0];

но держу пари, что без viewDidLoad метода Apple eventsArray равно nil - вам нужно будет создать его, если оно nil (т.е. eventsArray = [[NSMutableArray alloc] init];

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