2015-06-28 2 views
1

Я пытаюсь получить объект Core Data и загружать его из UITableView, который НЕ состоит из объектов Core Data. Это просто UITableView, сделанный с заданным массивом, но я хочу загрузить объект в Core Data с тем же именем, что и ячейки detailTextLabel. Я попробовал после this tutorial загрузить определенное значение, но он не работает: он сбой или говорит мне, что мой объект nil, которого нет.Объект Fetch Core Data из UITableViews, не сделанный из Core Data

Так в основном у меня есть UITableView, и загружает этот массив:

array = @[@"publication 1",@"publication 2", etc] 

Затем, когда пользователь выбирает ячейку, я хотел бы, чтобы загрузить документ на основе клеток detailText, но всегда загружает все объекты indexPath, а не на основе ячеек detailText. Поэтому скажите в главном контроллере представления, где заданный массив загружается в представление таблицы, я нажимаю на Memo 24, но его индекс равен (0,2), он загрузит объект, но он загрузит объект в загружаемом файле который имеет то же самое indexPath (независимо от публикации на 0,2), в отличие от заголовка Memo 24.

Вот мой код:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath]; 

    [self loadPublicationLocallyWithPubAtIndex:indexPath withTitle:cell.detailTextLabel.text]; 
} 

- (void)loadPublicationLocallyWithPubAtIndex:(NSIndexPath *)indexPath withTitle:(NSString *)pubNumber { 
    NSManagedObjectContext *selectedObject = [self.fetchedResultsController objectAtIndexPath:indexPath]; 
    NSString *phrase = nil; // Document password (for unlocking most encrypted PDF files) 
    NSString *filePath; 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    filePath = [[paths objectAtIndex:0] stringByAppendingPathComponent:@"PDFs"]; 
    filePath = [filePath stringByAppendingPathComponent:[selectedObject valueForKey:@"puburl"]]; assert(filePath != nil); ; 
    NSLog(@"Local path is : %@", filePath); 
    if ([[NSFileManager defaultManager] fileExistsAtPath:filePath]) 
    { 
     //File exists 
     NSData *data = [[NSData alloc] initWithContentsOfFile:filePath]; 
     if (data) 
     { 
      //load document 
     } 
    } 
} 

Он работает для всех моих контроллеров отображения, которые не заселяют с Core Data, независимо от того, что indexPath клетки, она по-прежнему получает правильный объект, так что заставляет меня верить, это что-то делать с [self.fetchedResultsController objectAtIndex:]; части, так что я даже попробовал:

NSIndexPath *selectedItem = [self.fetchedResultsController indexPathForObject:cell.detailTextLabel.text]; 

в didSelectRowAtIndexPath:, но он не работает.

Как вы загружаете объект на основе ячеек detailTextLabel в отличие от его indexPath?

ответ

2

Если вы заполняете свой массив из статического массива, вам, вероятно, не нужно использовать выбранный контроллер результатов. Вместо этого вы должны просто выполнить выборку, чтобы получить соответствующий NSManagedObject. Чтобы убедиться, что выборка получает только соответствующий объект, используйте предикат.

Предположим, что ваши объекты NSManagedObject находятся в объекте Publication, а соответствующий атрибут - title. Вы должны построить выборку следующим образом:

NSManagedObjectContext *context = self.managedObjectContext; // or however your context is obtained 
NSManagedObject *selectedObject; 
NSFetchRequest *fetch = [NSFetchRequest fetchRequestWithEntityName:@"Publication"]; // amend entity name as appropriate 
fetch.predicate = [NSPredicate predicateWithFormat:@"title == %@",pubNumber]; 
NSError *error; 
NSArray *results = [context executeFetchRequest:fetch error:&error]; 
if (results == nil) { 
    NSLog(@"Fetch error %@, %@", error, [error userInfo]); 
    abort(); 
} else { 
    if ([results count] == 0) { 
     NSLog(@"Publication not found"); 
    } else { 
     // (note, should probably also check for count > 1 and handle accordingly) 
     selectedObject = results[0]; 
     // then carry on with the remaining code from loadPublicationLocally.... 
     NSString *phrase = nil; // Document password (for unlocking most encrypted PDF files) 
     NSString *filePath; 
     NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
     filePath = [[paths objectAtIndex:0] stringByAppendingPathComponent:@"PDFs"]; 
     filePath = [filePath stringByAppendingPathComponent:[selectedObject valueForKey:@"puburl"]]; assert(filePath != nil); ; 
     // ... etc etc. 
    } 
} 
+0

Спасибо! Я пытаюсь использовать NSPredicate в течение 3 дней. Ваш спасатель жизни, я новичок в кодировании (очевидно), и большая часть моего кода была получена через SO, поэтому, надеюсь, этот ответ поможет будущим искателям вопросов! Спасибо спасибо спасибо –

+0

и благодарим вас за комментирование и объяснение вещей –

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