NSFetchRequest不显示任何内容

时间:2013-09-13 11:10:02

标签: iphone ios objective-c uitableview core-data

我正在尝试在tableView中显示项目,但我的fetchResult数组没有显示任何内容。 我得到这个NSLog:

2013-09-13 13:02:01.088 Prototype[67018:c07] managed object ()

YPProjectListVC.h

@interface YPProjectListViewController : UIViewController <UITableViewDelegate, UITableViewDataSource>

@end

YPProjectListVC.m

@interface YPProjectListViewController () {
    SelectionSuccessBlock successBlock;
}
@property (nonatomic,strong) NSManagedObjectContext *managedObjectContext;
@property (nonatomic, strong) UITableView *tableView;
@property (nonatomic, strong) NSMutableArray * data;
@property (nonatomic, strong) UIRefreshControl *spinner ;
@end

@implementation YPProjectListViewController

@synthesize tableView;
@synthesize data;
@synthesize spinner;
@synthesize managedObjectContext;

这是我的要求:

   - (void)viewDidLoad {
        [super viewDidLoad];
       spinner = [[UIRefreshControl alloc]initWithFrame:CGRectMake(130, 10, 40, 40)];

    managedObjectContext = [YPDataSingleton context];

    if(managedObjectContext){

        NSFetchRequest *request = [[NSFetchRequest alloc] init];
        NSEntityDescription *entity = [NSEntityDescription entityForName:@"Project" inManagedObjectContext:self.managedObjectContext];
        [request setEntity:entity];
        request.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"title" ascending:YES]];

        NSError *error;
        self.data = [[NSMutableArray alloc] init];
        NSArray *fetchResults  = [managedObjectContext executeFetchRequest:request error:&error];
        if (error != nil) {
            // Replace this implementation with code to handle the error appropriately.
            // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
            NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
            abort();
        }
        data=[fetchResults mutableCopy];
        NSLog(@"managed object %@",fetchResults);
        [self.tableView reloadData];
    } else {


        [self loadProjectsFromService];
        [spinner addTarget:self action:@selector(loadProjectsFromService) forControlEvents:UIControlEventValueChanged];
        [tableView addSubview:spinner];

    }
}

如果NSManagedObjectContext为空,我可以从服务中获取我的项目。

    -(void)loadProjectsFromService{
         [spinner beginRefreshing];
        self.data = [[NSMutableArray alloc] init];
         [self.tableView reloadData];
        [self.view addSubview:self.tableView];
        __weak typeof(self) weakSelf = self;
        successBlock = ^(NSDictionary *newData) {
            if ([newData count] > 0) {
                [weakSelf refreshData:newData];
            }

        };
            [spinner endRefreshing];
        [ypNetManager getProjectListWithSuccessBlock:successBlock error:NULL];

    }

pragma mark - 自定义getter

- (UITableView *)tableView {
    //custom init of the tableview
    if (!tableView) {
        // regular table view
        tableView = [[UITableView alloc] initWithFrame:UIEdgeInsetsInsetRect(self.view.bounds, tableViewInsets) style:UITableViewStylePlain];
        tableView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
        tableView.delegate = self;
        tableView.dataSource = self;
        tableView.backgroundColor = [UIColor clearColor];
        return tableView;
    }
    return tableView;
}

#pragma mark - Private methods 

- (void)refreshData:(NSDictionary *)newData {


        for (NSDictionary *projectDic in newData) {
          [data addObject:[Project createProjectWithDictionary: projectDic inManagedObjectContext:managedObjectContext]];
        }


        [self.tableView reloadData];

}

1 个答案:

答案 0 :(得分:1)

你应该使用NSFetchedResultsController,它会为你的工作,仔细提供和更新你的表视图。

请看这里:Core Data Tutorial for iOS: How To Use NSFetchedResultsController

修改

我仍然认为你应该使用上面但是现在,我可以理解你没有实现表视图的委托和数据源方法?

基本上,您需要实现告诉表视图的方法:

数据来源

您需要为表视图提供数据源,例如:

  1. 它应该有多少部分
  2. 任何部分中有多少行
  3. 要添加到表格单元格的内容是什么
  4. 还有更多,但这些是基本方法。

    <强>代表

    当您作为表格视图的委托者进行整合时,您只需为表格视图提供一个通知您的方式:

    1. 用户点按了其中一个单元格
    2. 用户点击了附件按钮
    3. 用户开始编辑表格
    4. 依旧......

      这里有很长的解释,很简单,并且有很多教程可以帮到你。

      试着看这里:

      Apple example project for tableViews

      在这里

      TableView Tutorial