2011-02-01 16 views
2

У меня есть приложение на основе документов с использованием Core Data, и у меня есть таблицаView, которая заполняется с помощью привязок и NSArrayController в IB. Все работает нормально, но я хотел убедиться, что первый столбец сразу будет в режиме редактирования при добавлении нового объекта в массив. Я осмотрел подходящий код и адаптировал некоторые из книги Hillegass. Редактирование работает отлично, но выбор строки не работает. Он остается в строке 0, и когда табуляция после редактирования, следующий отредактированный столбец находится в этой строке. Вот версия кода, который я использовал. Я искал решение для своей проблемы, но продолжаю получать результаты либо без Core Data, либо с привязками, либо с помощью приложения без документов. Я что-то упустил?Начать редактирование при вставке

-(IBAction)addEmployee:(id)sender { 

Employee *newEmployee = (Employee *)[NSEntityDescription insertNewObjectForEntityForName:@"Employee" inManagedObjectContext:[self managedObjectContext]]; 

//Fetch the update Employees 
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 

NSEntityDescription *employeeEntity = [NSEntityDescription entityForName:@"Employee" inManagedObjectContext:[self managedObjectContext]]; 
[fetchRequest setEntity:employeeEntity]; 

NSArray *fetchResults = [[self managedObjectContext] executeFetchRequest:fetchRequest error:&error]; 
[fetchRequest release]; 

NSError *error = nil; 

if (fetchResults == nil) { 
    // Something here to handle the error. 
    NSLog(@"The fetch results is null"); 
} 

int row = [fetchResults indexOfObjectIdenticalTo:newEmployee]; 


NSLog(@"row is %d",row); 

[[tableView window] endEditingFor:nil]; 

[tableView editColumn:1 row:row withEvent:nil select:YES]; 

}

Вот фиксированной (и значительно Simpified) версии

-(IBAction)addEmployee:(id)sender { 

Employee *newEmployee = [newEmployeeController newObject]; 
[newEmployeeController addObject:newEmployee]; 

[newEmployeeController rearrangeObjects]; 

NSArray *fetchResults = [newEmployeeController arrangedObjects]; 

int row = [fetchResults indexOfObjectIdenticalTo:newEmployee]; 

[[tableView window] endEditingFor:nil]; 

[tableView editColumn:1 row:row withEvent:nil select:YES]; 

    [newEmployee release]; 

}

+0

Получил его отсортировано. Теперь я оглядываюсь назад и серьезно задаюсь вопросом, что, черт возьми, я думал ... – BillySangster

+0

Относительно вашей фиксированной версии: вы освобождаете newEmployee слишком рано, а затем используете его при вызове 'indexOfObjectIdenticalTo:'. Используйте autorelease или просто отпустите его позже. –

+0

ОК, я выпустил его внизу внизу. Благодаря! – BillySangster

ответ

1

Во-первых, вам не нужно отбрасывать вставку объекта. -insertNewObjectForEntityForName: inManagedObjectContext: возвращает id, поэтому литой является redudant.

Вам не нужно извлекать объекты только для получения массива. Вы можете запросить NSArrayController для нового добавленного вами объекта, если его там нет, добавьте его (извините, прошло некоторое время с тех пор, как я использовал NSArrayController и не помню, нужен ли цикл цикла для обнаружения изменения).

Оттуда вы можете задать NSArrayController для индекса и перейти вперед.

+0

Ага, спасибо, мистер Зарра ..! Кажется, я старался быть слишком умным ради собственного блага. Теперь отлично. Еще раз спасибо (например, ваша книга с основными данными). – BillySangster