2

NSFetchedResultsController に固有の問題を回避するために、UITableViewController を UIViewController に変更し、tableView プロパティを追加することにしました。私はストーリーボードを使用しておらず、プログラムですべてを作成しています。これの目標は、上から y 軸上に約 44 ピクセルの空きスペースを残す (そこにユニバーサル ヘッダーを配置できるようにする) テーブル ビューを作成することです。基本的に、テーブルビューを 44 ピクセル下にシフトしようとしています。

問題は、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 によってフェッチされるはずのアイテムがテーブル ビューに取り込まれていないことです。これがなぜなのかわかりません...おそらく、テーブルビューがデリゲートなどではないからですか?

4

2 に答える 2

0

私にとっては、UITableViewController から UITableView を含む UIViewController に移動するため、NSFetchedResultsController を機能させるために次のことを行う必要がありました。

  1. ビュー コントローラーが UITableView と UITableViewDataSource のデリゲート メソッドを処理するようにしました。

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

  2. UITableViewのデリゲートとデータソースを設定します(私の場合、ストーリーボードからのアウトレットを使用してtableViewと呼びました)をself(私の場合は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
    }
    
于 2014-02-28T14:37:53.080 に答える