我正在尝试在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];
}
- (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];
}
答案 0 :(得分:1)
你应该使用NSFetchedResultsController,它会为你的工作,仔细提供和更新你的表视图。
请看这里:Core Data Tutorial for iOS: How To Use NSFetchedResultsController
修改强>
我仍然认为你应该使用上面但是现在,我可以理解你没有实现表视图的委托和数据源方法?
基本上,您需要实现告诉表视图的方法:
数据来源
您需要为表视图提供数据源,例如:
还有更多,但这些是基本方法。
<强>代表强>
当您作为表格视图的委托者进行整合时,您只需为表格视图提供一个通知您的方式:
依旧......
这里有很长的解释,很简单,并且有很多教程可以帮到你。
试着看这里:
Apple example project for tableViews
在这里