2

Чтобы обойти некоторые проблемы, присущие NSFetchedResultsController, я решил изменить свой UITableViewController на UIViewController и просто добавить свойство tableView. Я не использую раскадровки, и я делаю все программно. Цель этого состоит в том, чтобы иметь представление таблицы, которое оставляет около 44 пикселей пустого пространства (поэтому я могу разместить там универсальный заголовок) по оси y сверху. В основном, я пытаюсь сдвинуть таблицу вниз на 44 px.Перенос NSFetchedResultsController в UIViewController из UITableViewController

Проблема в том, что я получаю ошибки контрольной точки на fetchedResultsController. Вот мой код:

ViewController.h

@interface ToDoViewController : UIViewController <UITableViewDelegate, SettingsViewControllerDelegate, NSFetchedResultsControllerDelegate, UITableViewDataSource> 
@property (nonatomic) NSManagedObjectContext *managedObjectContext; 
@property (nonatomic, strong) UITableView *tableView; 
@property (nonatomic) NSFetchedResultsController *fetchedResultsController; 
@end 

ViewController.m

@implementation ToDoViewController 
@synthesize managedObjectContext; 
@synthesize fetchedResultsController = _fetchedResultsController; 
@synthesize tableView = _tableView; 
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { 
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
    if (self) { 
     UINavigationItem *i = [self navigationItem]; 
     [i setTitle:@"Task List"]; 
_tableView = [[UITableView alloc]initWithFrame:CGRectMake(0, 44, 320, 548) style:UITableViewStyleGrouped]; 
     [self.view addSubview:self.tableView]; 
     self.tableView = self.fetchedResultsController.delegate; 

    } 
    return self; 


-(void) viewDidLoad{ 
    [super viewDidLoad]; 

    NSError *error; 
    if (![[self fetchedResultsController] performFetch:&error]){ 
     NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
     exit(-1); 
    } 

    [self.tableView setDelegate:self]; 
    [self.tableView setDataSource:self]; 

    [self.tableView setBackgroundView:nil]; 
    [self.tableView setBackgroundColor:baseColor]; 
    [self.view setBackgroundColor:baseColor]; 

- (NSFetchedResultsController *)fetchedResultsController { 

    if (_fetchedResultsController != nil) { 
     return _fetchedResultsController; 
    } 

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
    NSEntityDescription *entity = [NSEntityDescription 
            entityForName:@"Tasks" inManagedObjectContext:self.managedObjectContext]; 
    [fetchRequest setEntity:entity]; 

    NSSortDescriptor *isCompleted = [[NSSortDescriptor alloc]initWithKey:@"sectionString" ascending:NO]; 
    NSSortDescriptor *sort = [[NSSortDescriptor alloc] 
           initWithKey:@"dateCreated" ascending:YES]; 
    [fetchRequest setSortDescriptors:@[isCompleted, sort]]; 
    [fetchRequest setFetchBatchSize:20]; 

    NSFetchedResultsController *theFetchedResultsController = 
    [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest 
             managedObjectContext:self.managedObjectContext sectionNameKeyPath:@"sectionString" 
                cacheName:nil]; 
    self.fetchedResultsController = theFetchedResultsController; 
    _fetchedResultsController.delegate = self; 

    return _fetchedResultsController; 

} 

Проблема в том, что представление таблицы не получает заселена с деталями, которые должны который будет выбран nsfetchedresultscontroller. Я не знаю, почему это ... возможно, потому что табличное представление не является делегатом или чем-то еще?

ответ

0

NSFetchedResultsControllerDelegate используется для мониторинга изменений в основных объектов данных, поэтому вам не нужно

self.tableView = self.fetchedResultsController.delegate; 

Вы должны реализовать методы UITableViewDelegate с помощью NSFetchedResultsController. В основном

- (NSInteger)tableView:(UITableView *)table numberOfRowsInSection:(NSInteger)section { 
    id <NSFetchedResultsSectionInfo> sectionInfo = [self.fetchedResultsController.sections objectAtIndex:section]; 
    return sectionInfo.numberOfObjects; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    static NSString *CellIdentifier = @"Cell"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath]; 
    NSManagedObject *managedObject = [self.fetchedResultsController objectAtIndexPath:indexPath]; 
    return cell; 
} 

Примечание: после создания NSFetchedResultsController, вы также должны вызвать performFetch:

Вы можете увидеть отличный пример реализации всего этого, используя шаблон Master-Detail и с «Use Сердечник Данные ".

+0

Я сделал все, что уже. ..:/ – EvilAegis

+0

Я чувствую, что проблема заключается в том, что я добавляю табличное представление как подвью, и NSFC не знает, чтобы отправить его в tableview. – EvilAegis

+0

NSFC не отправляет данные в tableview, он просто содержит данные , В представлении таблицы следует просить контроллер вашего представления предоставить данные через UITableViewDataSource Protocol. – Kevin

0

Для меня, исходя из UITableViewController собирается в UIViewController, содержащей UITableView, я должен был сделать следующее, чтобы получить NSFetchedResultsController работать:

  1. сделал методы делегата вид контроллера ручки для UITableView и UITableViewDataSource:

    @interface UIViewControllerName: UIViewController < UITableViewDelegate, NSFetchedResultsControllerDelegate, UITableViewDataSource>

  2. установить делегат и источник данных о UITableView (В моем случае я назвал его Tableview используя выход из раскадровки) к себе (в viewDidLoad в моем случае)

    [super viewDidLoad]; 
    
    self.tableView.delegate = self; 
    self.tableView.dataSource = self; 
    
    appDelegate = [[UIApplication sharedApplication] delegate]; 
    self.managedObjectContext = [appDelegate managedObjectContext]; 
    
    NSError *error; 
    if (![self.fetchedResultsController performFetch:&error]) { 
        // handle error 
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
        exit(-1); // fail 
    } 
    
Смежные вопросы