Core Data浅谈系列之五 : 在UITableView中展示

简介:
在逻辑上(表关系)将Team和Player关联起来后,我们将其展现到UI视图上。

首先,为App添加导航栏:
@interface AppDelegate : UIResponder <UIApplicationDelegate >

@property (strong, nonatomic) UIWindow *window;
@property (strong, nonatomic) UINavigationController *navController;
@property (strong, nonatomic) ViewController *viewController;

@end


@implementation AppDelegate

- (void)dealloc
{
    [_window release];
    [_navController release];
    [_viewController release];
    [super dealloc];
}

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
    // Override point for customization after application launch.
    self.viewController = [[[ViewController alloc] initWithNibName:@"ViewController" bundle:nil] autorelease];
    self.navController = [[[UINavigationController alloc] initWithRootViewController:self.viewController] autorelease];
    self.window.rootViewController = self.navController;
    [self.window makeKeyAndVisible];
    return YES;
}
然后在ViewController上添加一个UITableView,布局好并实现如下相应的代理函数:
#pragma mark - 
#pragma mark - UITableView DataSource

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return [self.teamArray count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *cellIdentifier = @"TeamTableViewCellIdentifier";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    if (nil == cell) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellIdentifier] autorelease];
    }
    
    Team *teamObject = [self.teamArray objectAtIndex:indexPath.row];
    UIImage *nbaImage = [UIImage imageNamed:@"nba@2x.jpg"];
    cell.imageView.image = nbaImage;
    cell.imageView.backgroundColor = [UIColorredColor];
    cell.textLabel.text = teamObject.name;
    cell.detailTextLabel.text = teamObject.city;
    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
    
    return cell;
}

#pragma mark - 
#pragma mark - UITableView Delegate

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    [tableView deselectRowAtIndexPath:indexPath animated:YES];
    
    Team *teamObject = [self.teamArray objectAtIndex:indexPath.row];
    PlayerListViewController *playerListVC = [[[PlayerListViewController alloc] init] autorelease];
    playerListVC.team = teamObject;
    playerListVC.cdViewController = self;
    [self.navigationController pushViewController:playerListVC animated:YES];
}
在插入一些球队信息后,可以得到如下效果(按球队名称排序):


- (NSArray *)fetchTeamList
{
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *teamEntity = [NSEntityDescription entityForName:@"Team" inManagedObjectContext:self.managedObjectContext];
    [fetchRequest setEntity:teamEntity];
    
    NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"name"ascending:YES];
    [fetchRequest setSortDescriptors:[NSArray arrayWithObject:sortDescriptor]];
    
    NSError *error = NULL;
    NSArray *array = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error];
    if (error) {
        NSLog(@"Error : %@\n", [error localizedDescription]);
    }
    
    [fetchRequest release], fetchRequest = nil;
    
    return array;
}
点击cell,就进入到该队的球员列表:


- (NSArray *)fetchPlayerList
{
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *teamEntity = [NSEntityDescription entityForName:@"Player" inManagedObjectContext:self.cdViewController.managedObjectContext];
    [fetchRequest setEntity:teamEntity];
    
    NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"age"ascending:YES];
    [fetchRequest setSortDescriptors:[NSArray arrayWithObject:sortDescriptor]];
    
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"team == %@", self.team];
    [fetchRequest setPredicate:predicate];
    
    NSError *error = NULL;
    NSArray *array = [self.cdViewController.managedObjectContext executeFetchRequest:fetchRequest error:&error];
    if (error) {
        NSLog(@"Error : %@\n", [error localizedDescription]);
    }
    
    [fetchRequest release], fetchRequest = nil;
    
    return array;
}
通过导航栏右边的Add按钮来添加球员信息:


- (IBAction)addBtnDidClick:(id)sender
{
    // We don't check the user input.
    Player *playerObject = [NSEntityDescription insertNewObjectForEntityForName:@"Player" inManagedObjectContext:self.cdViewController.managedObjectContext];
    playerObject.name = self.nameTextField.text;
    playerObject.age = [NSNumber numberWithInteger:[self.ageTextField.text integerValue]];
    playerObject.team = self.team;
    [self.cdViewController saveContext];
    [self dismissModalViewControllerAnimated:YES];
}


- (IBAction)cancelBtnDidClick:(id)sender
{
    [self dismissModalViewControllerAnimated:YES];
}
以上对NSManagedObject的操作都位于同一份NSManagedObjectContext中。如上面添加球员的函数addBtnDidClick:所注释的,添加球员信息时并没有对数据进行验证 —— 这将在下一篇讨论。

Brief Talk About Core Data Series, Part 5 : Showing in UITableView

Jason Lee @ Hangzhou

目录
相关文章
|
3月前
|
数据可视化 前端开发
Twaver-HTML5基础学习(39)鹰眼可视化视图组件(OverView)
本文介绍了如何在Twaver-HTML5中使用鹰眼(Overview)可视化视图组件,它作为Network的缩略图,允许用户通过缩略图导航Network,支持单击、双击和框选操作来控制Network视图。
51 5
Twaver-HTML5基础学习(39)鹰眼可视化视图组件(OverView)
winform .net6 和 framework 的图表控件,为啥项目中不存在chart控件,该如何解决?
本文讨论了在基于.NET 6和.NET Framework的WinForms项目中添加图表控件的不同方法。由于.NET 6的WinForms项目默认不包含Chart控件,可以通过NuGet包管理器安装如ScottPlot等图表插件。而对于基于.NET Framework的WinForms项目,Chart控件是默认存在的,也可以通过NuGet安装额外的图表插件,例如LiveCharts。文中提供了通过NuGet添加图表控件的步骤和截图说明。
winform .net6 和 framework 的图表控件,为啥项目中不存在chart控件,该如何解决?
《QT从基础到进阶·十二》QPixmap.load加载图片不更新问题
《QT从基础到进阶·十二》QPixmap.load加载图片不更新问题
279 0
|
XML JSON 自然语言处理
SAP UI5 初学者教程之二十一 - SAP UI5 的自定义格式器(Custom Formatter) 试读版
SAP UI5 初学者教程之二十一 - SAP UI5 的自定义格式器(Custom Formatter) 试读版
181 0
SAP UI5 初学者教程之二十一 - SAP UI5 的自定义格式器(Custom Formatter) 试读版
|
开发者
|
Android开发 开发工具
Android开发教程 - 使用Data Binding(二)集成与配置
本系列目录 使用Data Binding(一)介绍 使用Data Binding(二)集成与配置 使用Data Binding(三)在Activity中的使用 使用Data Binding(四)在Fragment中的使用 使用Data Binding(五)数据绑定 使用Data Binding(六.
1147 0