IPAD3 FICETIME正常ipad3使用说明书步骤

ipad4 使用3小时掉40%电量正常么?_ipad4吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:72,053贴子:
ipad4 使用3小时掉40%电量正常么?收藏
新买的ipad,刚入手第一次充电的时候剩余40%的时候就开充过这几天就wifi上上网,看差不多十分钟视频,二十分钟游戏,剩下的时间都在看电子书,结果电量从98掉到58= = 待机时间看了下是17小时这个耗电量是不是不正常呀?
那么计较干什么?没电就充。
你看电子书时是不是把屏幕亮度开得比较亮?屏幕太亮很耗电的。
……第一次用电比较快,然后……其实IPAD用7个小时就差不多要充电了……
我的小四第一次完了世界个小时,待机20+小时,才把电用完
差不多,蛮正常的
登录百度帐号我的游戏推荐游戏
后查看最近玩过的游戏
为兴趣而生,贴吧更懂你。或经验内容仅供参考,如果您需解决具体问题(尤其法律、医学等领域),建议您详细咨询相关领域专业人士。
请扫描分享到朋友圈用IPAD MINI打FACETIME的朋友,你们使用正常吗?
用IPAD MINI打FACETIME的朋友,你们使用正常吗?
前两天从官网订购一台iPad mini,和别人的iPad(朋友们均正常使用FACETIME)使用FACETIME老是提醒信号很弱,而且每次都是在5秒旁边画面断开,一分钟后声音也断开;我已经考试考试过:1,改换300M的路由器;2,重刷最新版固件,什么软件都不装;可是问题依旧啊,仍然是诡异的5秒就断开。可是和iPhone打FACETIME就一切正常。。。在网上一搜,貌似许多若干好多iPad MINI都有这个问题,严重思疑是iPad MINI的BUG。请问列位用MINI打FACETIME的兄弟,你们使用还正常吗?
刚前几天在华山顶facetime,一切正常,联通3G,对方4S,wifi跟电信3G都可以
其他回答 (10)
求问楼主MINI怎么才能和iPhone进行FT。。。
正常,就是电信的ADSL上传太差在喷香港使用的时候相当流利的
正常,就是电信的ADSL上传太差在喷香港使用的时候相当流利的
正常,就是电信的ADSL上传太差在喷香港使用的时候相当流利的
港版4G版mini facetime使用正常 50块钱水星路由
与国内mini有视频间断情形,语言正常。与海外iPhonr5一切正常,很流利。
正常,就是电信的ADSL上传太差在喷香港使用的时候相当流利的
在喷香港使用的时候相当流利的正常,就是电信的ADSL上传太差
正常,就是电信的ADSL上传太差在喷香港使用的时候相当流利的
刚前几天在华山顶facetime,一切正常,联通3G,对方4S,wifi跟电信3G都可以
相关知识等待您来回答
该问题来自:iPhone4S|iPad3|iPad2|Mac|iPod Touch4|苹果笔记Mac论坛笔记本电脑领域专家经验内容仅供参考,如果您需解决具体问题(尤其法律、医学等领域),建议您详细咨询相关领域专业人士。
请扫描分享到朋友圈开发步骤:一个使用核心数据的简单应用程序
本文所属图书&>&
开发人员们希望通过一本高级编程学习资源的指引下透彻掌握iPhone和iPad编程技术,在日益成熟的iPhone领域和方兴未艾的iPad领域大显身手,取得一番成就。本书满足了开发人员的这种需要,它循序渐进地描述iPhone和...&&
要创建使用核心数据存储联系人数据的应用程序,执行以下步骤:
(1) 启动Xcode,创建一个基于导航的iPhone应用程序,然后选中&Use Core Data for storage&选项。将项目命名为CoreDataStorage。附录A中列出了创建基于导航的应用程序的初始步骤,可从中了解有关该步骤的信息。
(2) 数据将被保存到Person对象中。为了创建Person类,选择File | New File选项,然后选中Objective-C类作为NSObject的子类,并将其命名为Person。
(3) 为了添加一个新的存储在核心数据中的Person,需要创建一个新的视图控制器。选择File | New File,然后选择UIViewController子类,确保只有&With XIB for user interface&复选框被选中。将这个新类命名为PersonAddViewController。
(4) 为了显示所选联系人的详细信息,需要创建一个新的视图控制器。选择File | New File,然后选择UIViewController子类,确保&UITableViewController subclass&复选框和&With XIB for user interface&复选框被选中。将这个新类命名为PersonDetailViewController。
(5) 双击PersonAddViewController.xib文件,启动Interface Builder(如图10-10所示)。
(6) 从Interface Builder的主菜单中选择Tools | Attributes Inspector选项,单击View窗口,然后将Background选项设置为Group Table View Background Color。
(7) 从主菜单中选择Tools | Library,然后选择Objects选项卡。
(8) 选择一个UITextField,将其拖入主视图并放在靠近主视图顶部的区域,然后松开鼠标。再重复此过程两次,最后形成3个纵向排列的文本字段(如图10-11所示)。
(9) 选中第一个文本字段,并执行如下操作:
在Placeholder(占位符)处输入First Name。
设置字体大小为17。
将Capitalize设置为Words。
(10) 对接下来的两个字段重复上述步骤,使用Last Name作为第二个文本字段的占位符,Phone作为第三个文本字段的占位符(如图10-12所示)。
(11) 选择Tools | Library,然后选择界面顶部的Classes,滚动选择PersonAddViewController类。在界面底部选择Outlets按钮,单击+号按钮并添加以下Outlet(如图10-13所示):
firstNameTextField(使用UITextField类型替代id类型)
lastNameTextField(使用UITextField类型替代id类型)
phoneTextField(使用UITextField类型替代id类型)
(12) 在Interface Builder主菜单中选择File | Write Class Files,从第一个弹出对话框中选择Save按钮,在下一个弹出对话框中选择Merge按钮。此时,添加过新内容的PersonAddViewController.h文件将显示在窗口左边,而其原始模板则位于右边(如图10-14所示)。
在右下角选择Actions | Choose Left。
选择File | Save Merge,关闭窗口。
现在无需再对PersonAddViewController.m文件进行任何修改,关闭文件。到此为止,已经拥有了一个包含应用程序视图逻辑的Objective-C模板。在真正着手编写程序之前,还需要在Interface Builder中完成一项工作,即建立所有关联:
将UITextField确定为firstNameTextField。
将UITextField确定为lastNameTextField。
将UITextField确定为phoneTextField。
(13) 为了在UITextField和firstNameTextField之间建立关联,在按住Ctrl键的同时单击File's Owner图标,打开File's Owner检查器(如图10-15所示)。
(14) 查看File's Owner检查器的右边,在按住Ctrl键的同时将firstNameTextField旁边的圆圈拖到UITextField firstNameTextField上,当圆圈高亮显示时松开鼠标。圆圈填满表明已经建立了关联。对lastNameTextField和phoneTextField重复这个过程(如图10-16所示)。
(15) 为了将PersonAddViewController设置为这3个文本字段的委托,在按住Ctrl键的同时将firstNameTextField拖到File's Owner图标上,然后选择委托。对lastNameTextField和phoneTextField重复此过程。这样,当用户点击键盘上的Done按钮时,键盘就会消失。选择File | Save选项保存文件。
到此为止,已经为应用程序添加了用户界面需要的所有内容,并建立了所有需要的关联。现在开始设计程序逻辑。
一个使用核心数据的简单应用程序的源程序清单
此应用程序直接使用自动生成的PListStorageAppDelegate.h文件和PlistStorageAppDelegate.m文件,并不对其进行修改。
修改PersonAddViewController.h模板文件
在Interface Builder中已经声明了3个Outlet:firstNameTextField、lastNameTextField和phoneTextField。为了获取和设置这些变量的值,必须定义其属性。
将IBOutlet移到属性声明中。
为了识别委托类,声明了一个id delegate变量,在本例中为RootViewController。当用户点击Save按钮来保存刚输入的联系人信息时,RootViewController将处理该保存行为。
为了处理文本字段委托消息,必须实现UITextFieldDelegate协议,因此,需要将其添加到类定义中。
程序清单10-30显示了完整的PersonAddViewController.h文件。
程序清单10-30& 完整的PersonAddViewController.h文件(/Chapter10/CoreDataStorage/Classes/Person-
AddViewController.h)
#import &UIKit/UIKit.h&
@interface PersonAddViewController : UIViewController &UITextFieldDelegate& {
&&& UITextField *firstNameTextF
&&& UITextField *lastNameTextF
&&& UITextField *phoneTextF
@property (nonatomic, retain) IBOutlet UITextField *firstNameTextF
@property (nonatomic, retain) IBOutlet UITextField *lastNameTextF
@property (nonatomic, retain) IBOutlet UITextField *phoneTextF
@property (nonatomic, retain)
修改PersonAddViewController.m模板文件
前面更新了头文件,定义了要添加到模板中的内容,下面开始修改PersonAddViewController.m模板。
因为用于处理保存行为的委托类是RootViewController,所以必须为该类添加#import指令。
此外,必须为每一个已经声明的视图属性添加相应的@synthesize(如程序清单10-31所示)。
程序清单10-31& 添加@synthesize
#import &PersonAddViewController.h&
#import &RootViewController.h&
@implementation PersonAddViewController
@synthesize firstNameTextF
@synthesize lastNameTextF
@synthesize phoneTextF
在viewDidLoad方法中初始化RootViewController视图时,会开始对导航栏进行配置。为了让用户确定视图的作用,将视图标题指定为Add Contact。还必须添加Save按钮和Cancel按钮,并将第一个文本字段设置为光标输入点(如程序清单10-32所示)。
程序清单10-32& viewDidLoad方法
#pragma mark -
#pragma mark View lifecycle
- (void)viewDidLoad {
&&& [super viewDidLoad];
&&& // Configure the navigation bar
&&& self.navigationItem.title = @&Add Contact&;
&&& UIBarButtonItem *cancelBarButtonItem = [[UIBarButtonItem alloc]
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& initWithTitle:@&Cancel&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& style:UIBarButtonItemStyleBordered
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& target:self
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& action:@selector(cancel)];
&&& [[self navigationItem] setLeftBarButtonItem:cancelBarButtonItem];
&&& [cancelBarButtonItem release];
&&& UIBarButtonItem *saveBarButtonItem = [[UIBarButtonItem alloc]
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& initWithTitle:@&Save&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& style:UIBarButtonItemStyleDone
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& target:self
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& action:@selector(save)];
&&& [[self navigationItem] setRightBarButtonItem:saveBarButtonItem];
&&& [saveBarButtonItem release];
&&& [firstNameTextField becomeFirstResponder];
当用户点击文本字段时,将自动出现键盘,为了关闭键盘,拥有输入光标的当前文本字段必须放弃作为第一个应答者的资格。这个过程由一个名为textFieldShouldReturn的UITextFieldDelegate方法实现(如程序清单10-33所示)。
程序清单10-33& textFieldShouldReturn方法
#pragma mark -
#pragma mark UITextFieldDelegate
- (BOOL)textFieldShouldReturn:(UITextField *)textField {
&&& [textField resignFirstResponder];
&&& return YES;
最后,为了能够响应Save按钮和Cancel按钮,必须提供相关的方法。这两个方法都通过调用委托类(在本例中为RootViewController)来处理相应的操作,如程序清单10-34所示。
程序清单10-34& save方法和cancel方法
#pragma mark -
#pragma mark Action methods
- (void)save {
&&& [[self delegate] savePerson:self];
- (void)cancel {
&&& [[self delegate] cancel];
到此为止,已经完成了PersonAddViewController.m类。程序清单10-35显示了完整的实现代码。
程序清单10-35& 完整的PersonAddViewController.m文件(/Chapter10/CoreDataStorage/Classes/Person-
AddViewController.m)
#import &PersonAddViewController.h&
#import &RootViewController.h&
@implementation PersonAddViewController
@synthesize firstNameTextF
@synthesize lastNameTextF
@synthesize phoneTextF
#pragma mark -
#pragma mark View lifecycle
- (void)viewDidLoad {
&&& [super viewDidLoad];
&&& // Configure the navigation bar
&&& self.navigationItem.title = @&Add Contact&;
&&& UIBarButtonItem *cancelBarButtonItem = [[UIBarButtonItem alloc]
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& initWithTitle:@&Cancel&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& style:UIBarButtonItemStyleBordered
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& target:self
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& action:@selector(cancel)];
&&& [[self navigationItem] setLeftBarButtonItem:cancelBarButtonItem];
&&& [cancelBarButtonItem release];
&&& UIBarButtonItem *saveBarButtonItem = [[UIBarButtonItem alloc]
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& initWithTitle:@&Save&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& style:UIBarButtonItemStyleDone
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& target:self
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& action:@selector(save)];
&&& [[self navigationItem] setRightBarButtonItem:saveBarButtonItem];
&&& [saveBarButtonItem release];
&&& [firstNameTextField becomeFirstResponder];
#pragma mark -
#pragma mark UITextFieldDelegate
- (BOOL)textFieldShouldReturn:(UITextField *)textField {
&&& [textField resignFirstResponder];
&&& return YES;
#pragma mark -
#pragma mark Action methods
- (void)save {
&&& [[self delegate] savePerson:self];
- (void)cancel {
&&& [[self delegate] cancel];
#pragma mark -
#pragma mark Memory methods
- (void)didReceiveMemoryWarning {
&&& [super didReceiveMemoryWarning];
- (void)viewDidUnload {
&&& [self setFirstNameTextField:nil];
&&& [self setLastNameTextField:nil];
&&& [self setPhoneTextField:nil];
&&& [super viewDidUnload];
- (void)dealloc {
&&& [firstNameTextField release];
&&& [lastNameTextField release];
&&& [phoneTextField release];
&&& [super dealloc];
修改RootViewController.h模板文件
在基于导航的应用程序中,当应用程序启动时,RootViewController是用户看到的中心视图。所有数据导航都从该视图开始。
在此应用程序中,会从NSManagedObjectContext中的Person实体获取结果集,NSFetched- ResultsController负责对获取的结果集进行管理。
还必须为PersonAddViewController类提供两个可以调用的委托方法&&savePerson委托方法和cancel委托方法。
程序清单10-36显示了完整的RootViewController.h文件。
程序清单10-36& 完整的RootViewController.h文件(/Chapter10/CoreDataStorage/Classes/RootView-
Controller.h)
#import &UIKit/UIKit.h&
#import &CoreData/CoreData.h&
@class PersonAddViewC
@interface RootViewController : UITableViewController
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &NSFetchedResultsControllerDelegate& {
&&& NSFetchedResultsController *fetchedResultsController_;
&&& NSManagedObjectContext *managedObjectContext_;
@property (nonatomic, retain) NSManagedObjectContext *managedObjectC
@property (nonatomic, retain) NSFetchedResultsController *fetchedResultsC
- (void)addPerson:(id)
- (void)savePerson:(PersonAddViewController *)
修改RootViewController.m模板文件
前面更新了头文件,定义了添加到模板的内容,下面开始修改RootViewController.m模板。
因为RootViewController是此应用程序的基础视图,所以需要导入所有的类。PersonAdd- ViewController类负责添加新的联系人。PersonDetailViewController类负责显示联系人的详细信息。Person类的成员负责创建、保存和显示对象。
另外需要注意,有一个由模板生成的私有方法&&configureCell:IndexPath:,该方法用于确定显示在每个表格视图单元格中的值。
必须为每个已经声明的视图属性添加相应的@synthesize(如程序清单10-37所示)。
程序清单10-37& 添加@synthesize
#import &RootViewController.h&
#import &PersonAddViewController.h&
#import &PersonDetailViewController.h&
#import &Person.h&
@interface RootViewController ()
- (void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexP
@implementation RootViewController
@synthesize fetchedResultsController=fetchedResultsController_;
@synthesize managedObjectContext=managedObjectContext_;
在viewDidLoad方法中初始化RootViewController视图时,会使用NSFetchedResultsController实例对先前存储的所有信息进行加载。可以通过NSManagedObjectContext访问Person实体(使用NSManagedObjects表示)。
为了让用户确定该视图的功能,将导航栏标题指定为Contacts。此外,必须在导航栏添加Edit按钮和+号按钮(如图10-9所示)。
在获取到数据之后,为了刷新表格视图,需要在viewWillAppear方法中进行表格视图重载(如程序清单10-38所示)。
程序清单10-38& viewDidLoad方法和viewWillAppear方法
#pragma mark -
#pragma mark View lifecycle
- (void)viewDidLoad {
&&& [super viewDidLoad];
&&& [self setTitle:@&Contacts&];
&&& [[self navigationItem] setLeftBarButtonItem:[self editButtonItem]];
&&& UIBarButtonItem *addButtonItem = [[UIBarButtonItem alloc]
&&&&&&&&&&&&&&&&&&&&&&& initWithBarButtonSystemItem:UIBarButtonSystemItemAdd
&&&&&&&&&&&&&&&&&&&&&&& target:self
&&&&&&&&&&&&&&&&&&&&&&& action:@selector(addPerson:)];
&&& [[self navigationItem] setRightBarButtonItem:addButtonItem];
&&& [addButtonItem release];
&&& NSError *
&&& if (![[self fetchedResultsController] performFetch:&error]) {
&&&&&&& // Update to handle the error appropriately.
&&&&&&& NSLog(@&Unresolved error %@, %@&, error, [error userInfo]);
&&&&&&& exit(-1);& // Fail
// Implement viewWillAppear: to do additional setup before the
// view is presented.
- (void)viewWillAppear:(BOOL)animated {
&&& [super viewWillAppear:animated];
&&& [[self tableView] reloadData];
当用户点击+号按钮来添加一个新联系人时,addPerson方法会处理该操作,与PersonAdd- ViewController类关联的视图中会显示所有输入的联系人信息(如程序清单10-39所示)。
程序清单10-39& addPerson方法
#pragma mark -
#pragma mark Action methods
- (void)addPerson:(id)sender {
&&& PersonAddViewController *addController =
&&&&&&&&&&&&&&&&&&&&&&&&&&&& [[PersonAddViewController alloc] init];
&&& [addController setDelegate:self];
&&& UINavigationController *navigationController =
&&&&&&&&&&&&&&&&&&&&&&& [[UINavigationController alloc]
&&&&&&&&&&&&&&&&&&&&&&& initWithRootViewController:addController];
&&& [self presentModalViewController:navigationController animated:YES];
&&& [navigationController release];
&&& [addController release];
RootViewController响应由PersonAddViewController发送的savePerson操作和cancel操作。cancel方法会关闭输入视图。savePerson方法会获取Person实体的managedObjectsContext,然后创建一个新的NSManagedObject。会使用从PersonAddViewController类中输入的值来填充Person对象,然后保存上下文(如程序清单10-40所示)。
程序清单10-40& savePerson委托方法和cancel委托方法
#pragma mark -
#pragma mark Delegate Action methods
- (void)savePerson:(PersonAddViewController *)sender {
&&& // Create a new instance of the entity managed by the
&&& // fetched results controller.
&&& NSManagedObjectContext *context =
&&&&&&&& [[self fetchedResultsController] managedObjectContext];
&&& NSEntityDescription *entity =
&&&&&&&& [[[self fetchedResultsController] fetchRequest] entity];
&&& NSManagedObject *newManagedObject =
&&&&&&&& [NSEntityDescription insertNewObjectForEntityForName:[entity name]
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& inManagedObjectContext:context];
&&& [newManagedObject setValue:[[sender firstNameTextField] text]
&&&&&&&&&&&&&&&&&&&&&&&&&&& forKey:@&firstName&];
&&& [newManagedObject setValue:[[sender lastNameTextField] text]
&&&&&&&&&&&&&&&&&&&&&&&&&&& forKey:@&lastName&];
&&& [newManagedObject setValue:[[sender phoneTextField] text]
&&&&&&&&&&&&&&&&&&&&&&&&&&& forKey:@&phone&];
&&& // Save the context.
&&& NSError *error =
&&& if (![context save:&error]) {
&&&&&&& NSLog(@&Unresolved error %@, %@&, error, [error userInfo]);
&&&&&&& abort();
&&& [[self tableView] reloadData];
&&& [self dismissModalViewControllerAnimated:YES];
- (void)cancel {
&&& [self dismissModalViewControllerAnimated:YES];
在表格视图中,信息的显示格式取决于以下两个因素:
信息区块的数目
每个区块中的行数
此应用程序中的数据均为联系人信息,可以看作一类数据,所以只需要一个区块。此区块中的行数由NSFetchedResultsSectionInfo中的对象数目决定(如程序清单10-41所示)。
程序清单10-41& numberOfSectionsInTableView方法和tableView:numberOfRowsInSection方法
#pragma mark -
#pragma mark Table view data source
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
&&& return [[[self fetchedResultsController] sections] count];
- (NSInteger)tableView:(UITableView *)tableView
&&&&&&&&&&&&&&&&&&&&&&&&&&&&& numberOfRowsInSection:(NSInteger)section {
&&& id &NSFetchedResultsSectionInfo& sectionInfo =
&&&&&&&&&&&&&&& [[[self fetchedResultsController] sections]
&&&&&&&&&&&&&&&& objectAtIndex:section];
&&& return [sectionInfo numberOfObjects];
表格视图仅将联系人姓氏显示在列表中。为了显示排序列表,需要配置fetchedResultsController方法,将其排序字段设置为升序或者降序(如程序清单10-42所示)。
程序清单10-42& fetchedResultsController方法
#pragma mark -
#pragma mark Fetched results controller
- (NSFetchedResultsController *)fetchedResultsController {
&&& if (fetchedResultsController_ != nil) {
&&&&&&& return fetchedResultsController_;
&&&& Set up the fetched results controller.
&&& // Create the fetch request for the entity.
&&& NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
&&& // Edit the entity name as appropriate.
&&& NSEntityDescription *entity =
&&&&&&&&&&&&&&&&&&&&& [NSEntityDescription entityForName:@&Person&
&&&&&&&&&&&&&&&&&&&&& inManagedObjectContext:self.managedObjectContext];
&&& [fetchRequest setEntity:entity];
&&& // Set the batch size to a suitable number.
&&& [fetchRequest setFetchBatchSize:20];
&&& // Edit the sort key as appropriate.
&&& NSSortDescriptor *sortDescriptor =
&&&&&&&&&&&&&&&&&& [[NSSortDescriptor alloc] initWithKey:@&lastName&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ascending:YES];
&&& NSArray *sortDescriptors = [[NSArray alloc]
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& initWithObjects:sortDescriptor, nil];
&&& [fetchRequest setSortDescriptors:sortDescriptors];
&&& // Edit the section name key path and cache name if appropriate.
&&& // nil for section name key path means &no sections&.
&&& NSFetchedResultsController *aFetchedResultsController =
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& [[NSFetchedResultsController alloc]
&&&&&&&&&&&&&&&&&&&&&&&&& initWithFetchRequest:fetchRequest
&&&&&&&&&&&&&&&&&&&&&&&&& managedObjectContext:[self managedObjectContext]
&&&&&&&&&&&&&&&&&&&&&&&&& sectionNameKeyPath:nil cacheName:@&Root&];
&&& [aFetchedResultsController setDelegate:self];
&&& [self setFetchedResultsController:aFetchedResultsController];
&&& [aFetchedResultsController release];
&&& [fetchRequest release];
&&& [sortDescriptor release];
&&& [sortDescriptors release];
&&& NSError *error =
&&& if (![fetchedResultsController_ performFetch:&error]) {
&&&&&&& NSLog(@&Unresolved error %@, %@&, error, [error userInfo]);
&&&&&&& abort();
&&& return fetchedResultsController_;
为了在表格视图中显示姓氏,必须从核心数据中进行检索。configureCell:atIndexPath:方法从fetchedResultsController中获取到姓氏,并将其插入NSManagedObject中。此后,需要从托管对象中检索姓氏值,并将其显示在表格视图单元格中。
用于检索姓氏的特定行将作为一个NSIndexPath对象,传入tableView:cellForRowAtIndexPath:方法中(如程序清单10-43所示)。
程序清单10-43& configureCell:atIndexPath:方法和tableView:cellForRowAtIndexPath:方法
#pragma mark -
#pragma mark TableView cell appearance
- (void)configureCell:(UITableViewCell *)cell
&&&&&&& atIndexPath:(NSIndexPath *)indexPath {
&&& NSManagedObject *managedObject =
&&&&&&&& [[self fetchedResultsController] objectAtIndexPath:indexPath];
&&& [[cell textLabel] setText:[[managedObject valueForKey:@&lastName&]
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& description]];
// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView
&&&&&&&&&& cellForRowAtIndexPath:(NSIndexPath *)indexPath {
&&& static NSString *CellIdentifier = @&Cell&;
&&& UITableViewCell *cell =
&&&&&&&& [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
&&& if (cell == nil) {
&&&&&&& cell = [[[UITableViewCell alloc]
&&&&&&&&&&&&&&&& initWithStyle:UITableViewCellStyleDefault
&&&&&&&&&&&&&&&& reuseIdentifier:CellIdentifier] autorelease];
&&&&&&& [cell setAccessoryType:UITableViewCellAccessoryDisclosureIndicator];
&&& // Configure the cell.
&&& [self configureCell:cell atIndexPath:indexPath];
要删除列表中的某个联系人,用户需要点击Edit按钮,然后点击红色减号按钮,最后点击Delete按钮。虽然tabelView:commitEditingStyle:forRowAtIndexPath委托方法可以处理上述操作并从表格视图中删除单元格,但您还是必须从核心数据中删除联系人数据(如程序清单10-44所示)。
程序清单10-44& tableView:commitEditingStyle:forRowAtIndexPath方法
// Override to support editing the table view.
- (void)tableView:(UITableView *)tableView
&&&&&&&&&&&&&&&&&&&& commitEditingStyle:(UITableViewCellEditingStyle)editingStyle
&&&&&&&&&&&&&&&&&&&& forRowAtIndexPath:(NSIndexPath *)indexPath {
&&& if (editingStyle == UITableViewCellEditingStyleDelete) {
&&&&&&& // Delete the managed object for the given index path
&&&&&&& NSManagedObjectContext *context =
&&&&&&&&&&&& [[self fetchedResultsController] managedObjectContext];
&&&&&&& [context deleteObject:[[self fetchedResultsController]
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& objectAtIndexPath:indexPath]];
&&&&&&& // Save the context.
&&&&&&& NSError *error =
&&&&&&& if (![context save:&error]) {
&&&&&&&&&&& NSLog(@&Unresolved error %@, %@&, error, [error userInfo]);
&&&&&&&&&&& abort();
用户点击某个联系人表示需要查看详细信息。为响应该请求,用fetchedResultController检索到的Person对象将存储到PersonDetailViewController类的一个实例中,随后将压入导航栈来显示联系人详细信息(如程序清单10-45所示)。
程序清单10-45& tableView:didSelectRowAtIndexPath方法
#pragma mark -
#pragma mark Table view delegate
- (void)tableView:(UITableView *)tableView
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
&&& Person *person = (Person *)[[self fetchedResultsController]
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& objectAtIndexPath:indexPath];
&&& PersonDetailViewController *personDetailViewController =
&&& [[PersonDetailViewController alloc]
&&&& initWithStyle:UITableViewStyleGrouped];
&&& [personDetailViewController setContact:person];
&&& [[self navigationController] pushViewController:personDetailViewController
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& animated:YES];
&&& [personDetailViewController release];
到此为止,已经完成了对RootViewController.m类模板的修改。程序清单10-46显示了完整的实现代码。
程序清单10-46& 完整的RootViewController.m文件(/Chapter10/CoreDataStorage/Classes/Root-
ViewController.m)
#import &RootViewController.h&
#import &PersonAddViewController.h&
#import &PersonDetailViewController.h&
#import &Person.h&
@interface RootViewController ()
- (void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexP
@implementation RootViewController
@synthesize fetchedResultsController=fetchedResultsController_;
@synthesize managedObjectContext=managedObjectContext_;
#pragma mark -
#pragma mark View lifecycle
- (void)viewDidLoad {
&&& [super viewDidLoad];
&&& [self setTitle:@&Contacts&];
&&& [[self navigationItem] setLeftBarButtonItem:[self editButtonItem]];
&&& UIBarButtonItem *addButtonItem = [[UIBarButtonItem alloc]
&&&&&&&&&&&&&&&&&&& initWithBarButtonSystemItem:UIBarButtonSystemItemAdd
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& target:self
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& action:@selector(addPerson:)];
&&& [[self navigationItem] setRightBarButtonItem:addButtonItem];
&&& [addButtonItem release];
&&& NSError *
&&& if (![[self fetchedResultsController] performFetch:&error]) {
&&&&&&& // Update to handle the error appropriately.
&&&&&&& NSLog(@&Unresolved error %@, %@&, error, [error userInfo]);
&&&&&&& exit(-1);& // Fail
// Implement viewWillAppear: to do additional setup before the
// view is presented.
- (void)viewWillAppear:(BOOL)animated {
&&& [super viewWillAppear:animated];
&&& [[self tableView] reloadData];
#pragma mark -
#pragma mark Action methods
- (void)addPerson:(id)sender {
&&& PersonAddViewController *addController =
&&&&&&&&&&&&&&&&&&&&&&&&&&& [[PersonAddViewController alloc] init];
&&& [addController setDelegate:self];
&&& UINavigationController *navigationController =
&&&&&&&&&&&&&&&&&&&&&&&&&&& [[UINavigationController alloc]
&&&&&&&&&&&&&&&&&&&&&&&&&&& initWithRootViewController:addController];
&&& [self presentModalViewController:navigationController animated:YES];
&&& [navigationController release];
&&& [addController release];
#pragma mark -
#pragma mark Delegate Action methods
- (void)savePerson:(PersonAddViewController *)sender {
&&& // Create a new instance of the entity managed by the
&&& // fetched results controller.
&&& NSManagedObjectContext *context =
&&&&&&&& [[self fetchedResultsController] managedObjectContext];
&&& NSEntityDescription *entity =
&&&&&&&& [[[self fetchedResultsController] fetchRequest] entity];
&&& NSManagedObject *newManagedObject =
&&&&&&&& [NSEntityDescription insertNewObjectForEntityForName:[entity name]
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& inManagedObjectContext:context];
&&& [newManagedObject setValue:[[sender firstNameTextField] text]
&&&&&&&&&&&&&&&&&&&&&&&&&&&& forKey:@&firstName&];
&&& [newManagedObject setValue:[[sender lastNameTextField] text]
&&&&&&&&&&&&&&&&&&&&&&&&&&&& forKey:@&lastName&];
&&& [newManagedObject setValue:[[sender phoneTextField] text]
&&&&&&&&&&&&&&&&&&&&&&&&&&&& forKey:@&phone&];
&&& // Save the context.
&&& NSError *error =
&&& if (![context save:&error]) {
&&&&&&& NSLog(@&Unresolved error %@, %@&, error, [error userInfo]);
&&&&&&& abort();
&&& [[self tableView] reloadData];
&&& [self dismissModalViewControllerAnimated:YES];
- (void)cancel {
&&& [self dismissModalViewControllerAnimated:YES];
#pragma mark -
#pragma mark Table view data source
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
&&& return [[[self fetchedResultsController] sections] count];
- (NSInteger)tableView:(UITableView *)tableView
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& numberOfRowsInSection:(NSInteger)section {
&&& id &NSFetchedResultsSectionInfo& sectionInfo =
&&&&&&&&&&&&&&& [[[self fetchedResultsController] sections]
&&&&&&&&&&&&&&&&&& objectAtIndex:section];
&&& return [sectionInfo numberOfObjects];
#pragma mark -
#pragma mark TableView cell appearance
- (void)configureCell:(UITableViewCell *)cell
&&&&&&&&&&& atIndexPath:(NSIndexPath *)indexPath {
&&& NSManagedObject *managedObject =
&&&&&&&& [[self fetchedResultsController] objectAtIndexPath:indexPath];
&&& [[cell textLabel] setText:[[managedObject valueForKey:@&lastName&]
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& description]];
// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView
&&&&&&&& cellForRowAtIndexPath:(NSIndexPath *)indexPath {
&&& static NSString *CellIdentifier = @&Cell&;
&&& UITableViewCell *cell =
&&&&&&&& [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
&&& if (cell == nil) {
&&&&&&& cell = [[[UITableViewCell alloc]
&&&&&&&&&&&&&&&&&& initWithStyle:UITableViewCellStyleDefault
&&&&&&&&&&&&&&&&&& reuseIdentifier:CellIdentifier] autorelease];
&&&&&&& [cell setAccessoryType:UITableViewCellAccessoryDisclosureIndicator];
&&& // Configure the cell.
&&& [self configureCell:cell atIndexPath:indexPath];
// Override to support editing the table view.
- (void)tableView:(UITableView *)tableView
&&&&&&&&&&&&&&&&&&& commitEditingStyle:(UITableViewCellEditingStyle)editingStyle
&&&&&&&&&&&&&&&&&&&& forRowAtIndexPath:(NSIndexPath *)indexPath {
&&& if (editingStyle == UITableViewCellEditingStyleDelete) {
&&&&&&& // Delete the managed object for the given index path
&&&&&&& NSManagedObjectContext *context =
&&&&&&& [[self fetchedResultsController] managedObjectContext];
&&&&&&& [context deleteObject:[[self fetchedResultsController]
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& objectAtIndexPath:indexPath]];
&&&&&&& // Save the context.
&&&&&&& NSError *error =
&&&&&&& if (![context save:&error]) {
&&&&&&&&&&& NSLog(@&Unresolved error %@, %@&, error, [error userInfo]);
&&&&&&&&&&& abort();
- (BOOL)tableView:(UITableView *)tableView
&&&&&&&&&&&&&&&&&&&&&&&&&&& canMoveRowAtIndexPath:(NSIndexPath *)indexPath {
&&& // The table view should not be re-orderable.
&&& return NO;
#pragma mark -
#pragma mark Table view delegate
- (void)tableView:(UITableView *)tableView
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
&&& Person *person = (Person *)[[self fetchedResultsController]
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& objectAtIndexPath:indexPath];
&&& PersonDetailViewController *personDetailViewController =
&&& [[PersonDetailViewController alloc]
&&&& initWithStyle:UITableViewStyleGrouped];
&&& [personDetailViewController setContact:person];
&&& [[self navigationController] pushViewController:personDetailViewController
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& animated:YES];
&&& [personDetailViewController release];
#pragma mark -
#pragma mark Fetched results controller
- (NSFetchedResultsController *)fetchedResultsController {
&&& if (fetchedResultsController_ != nil) {
&&&&&&& return fetchedResultsController_;
&&&& Set up the fetched results controller.
&&& // Create the fetch request for the entity.
&&& NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
&&& // Edit the entity name as appropriate.
&&& NSEntityDescription *entity =
&&&&&&&&&&&&&&&&&&&&&&&&& [NSEntityDescription entityForName:@&Person&
&&&&&&&&&&&&&&&&&&&&&&&&& inManagedObjectContext:self.managedObjectContext];
&&& [fetchRequest setEntity:entity];
&&& // Set the batch size to a suitable number.
&&& [fetchRequest setFetchBatchSize:20];
&&& // Edit the sort key as appropriate.
&&& NSSortDescriptor *sortDescriptor =
&&&&&&&&&&&&&&& [[NSSortDescriptor alloc] initWithKey:@&lastName&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ascending:YES];
&&& NSArray *sortDescriptors = [[NSArray alloc]
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& initWithObjects:sortDescriptor, nil];
&&& [fetchRequest setSortDescriptors:sortDescriptors];
&&& // Edit the section name key path and cache name if appropriate.
&&& // nil for section name key path means &no sections&.
&&& NSFetchedResultsController *aFetchedResultsController =
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& [[NSFetchedResultsController alloc]
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& initWithFetchRequest:fetchRequest
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& managedObjectContext:[self managedObjectContext]
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& sectionNameKeyPath:nil cacheName:@&Root&];
&&& [aFetchedResultsController setDelegate:self];
&&& [self setFetchedResultsController:aFetchedResultsController];
&&& [aFetchedResultsController release];
&&& [fetchRequest release];
&&& [sortDescriptor release];
&&& [sortDescriptors release];
&&& NSError *error =
&&& if (![fetchedResultsController_ performFetch:&error]) {
&&&&&&& NSLog(@&Unresolved error %@, %@&, error, [error userInfo]);
&&&&&&& abort();
&&& return fetchedResultsController_;
#pragma mark -
#pragma mark Fetched results controller delegate
- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller {
&&& [[self tableView] beginUpdates];
- (void)controller:(NSFetchedResultsController *)controller
&&&&&&&&&&&&&&&&&&&& didChangeSection:(id &NSFetchedResultsSectionInfo&)sectionInfo
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& atIndex:(NSUInteger)sectionIndex
&&&&&&&&&&&&&&&&&&&&& forChangeType:(NSFetchedResultsChangeType)type {
&&& switch(type) {
&&&&&&& case NSFetchedResultsChangeInsert:
&&&&&&&&&&& [self.tableView insertSections:[NSIndexSet
&&&&&&&&&&&&&&&&&&&&&&&&&&& indexSetWithIndex:sectionIndex]
&&&&&&&&&&&&&&&&&&&&&&&&&&&& withRowAnimation:UITableViewRowAnimationFade];
&&&&&&&&&&&
&&&&&&&&&&&
&&&&&&& case NSFetchedResultsChangeDelete:
&&&&&&&&&&& [self.tableView deleteSections:[NSIndexSet
&&&&&&&&&&&&&&&&&&&&&&&&&&& indexSetWithIndex:sectionIndex]
&&&&&&&&&&&&&&&&&&&&&&&&&&&&& withRowAnimation:UITableViewRowAnimationFade];
&&&&&&&&&&&
- (void)controller:(NSFetchedResultsController *)controller
&& didChangeObject:(id)anObject
&&&&&& atIndexPath:(NSIndexPath *)indexPath
&&&& forChangeType:(NSFetchedResultsChangeType)type
&&&&& newIndexPath:(NSIndexPath *)newIndexPath {
&&& UITableView *tableView = self.tableV
&&& switch(type) {
&&&&&&&&&&&
&&&&&&& case NSFetchedResultsChangeInsert:
&&&&&&&&&&& [tableView insertRowsAtIndexPaths:
&&&&&&&&&&&&&&&&&&&& [NSArray arrayWithObject:newIndexPath]
&&&&&&&&&&&&&&&&&&&&&&&&&&&& withRowAnimation:UITableViewRowAnimationFade];
&&&&&&&&&&&
&&&&&&&&&&&
&&&&&&& case NSFetchedResultsChangeDelete:
&&&&&&&&&&& [tableView deleteRowsAtIndexPaths:
&&&&&&&&&&&&&&&&&&&& [NSArray arrayWithObject:indexPath]
&&&&&&&&&&&&&&&&&&&&&&&&&&&& withRowAnimation:UITableViewRowAnimationFade];
&&&&&&&&&&&
&&&&&&&&&&&
&&&&&&& case NSFetchedResultsChangeUpdate:
&&&&&&&&&&& [self configureCell:[tableView cellForRowAtIndexPath:indexPath]
&&&&&&&&&&&&&&&&&&& atIndexPath:indexPath];
&&&&&&&&&&&
&&&&&&&&&&&
&&&&&&& case NSFetchedResultsChangeMove:
&&&&&&&&&&& [tableView deleteRowsAtIndexPaths:
&&&&&&&&&&&&&&&&&&&& [NSArray arrayWithObject:indexPath]
&&&&&&&&&&&&&&&&&&&&&&&&&&&& withRowAnimation:UITableViewRowAnimationFade];
&&&&&&&&&&& [tableView insertRowsAtIndexPaths:
&&&&&&&&&&&&&&&&&&&& [NSArray arrayWithObject:newIndexPath]
&&&&&&&&&&&&&&&&&&&&&&&&&&&& withRowAnimation:UITableViewRowAnimationFade];
&&&&&&&&&&&
- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller {
&&& [[self tableView] endUpdates];
&// Implementing the above methods to update the table view in
&response to individual changes may have performance implications
&if a large number of changes are made simultaneously.
&If this proves to be an issue, you can instead just implement
&controllerDidChangeContent: which notifies the delegate that all
&section and object changes have been processed.
&- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller {
&// In the simplest, most efficient, case, reload the table view.
&[self.tableView reloadData];
#pragma mark -
#pragma mark Memory management
- (void)didReceiveMemoryWarning {
&&& [super didReceiveMemoryWarning];
- (void)viewDidUnload {
&&& [self setFetchedResultsController:nil];
- (void)dealloc {
&&& [fetchedResultsController_ release];
&&& [managedObjectContext_ release];
&&& [super dealloc];
修改PersonDetailViewController.h模板文件
当用户从RootViewController的列表中选中一个联系人,并想要查看该联系人的详细信息时,会初始化PersonDetailViewController类并进行显示。
只需维护被选中的Person对象的值。
程序清单10-47显示了完整的PersonDetailViewContrller.h文件。
程序清单10-47& 完整的PersonDetailViewController.h文件(/Chapter10/CoreDataStorage/Classes/Person-
DetailViewController.h)
#import &UIKit/UIKit.h&
@interface PersonDetailViewController : UITableViewController {
&&& Person *
@property (nonatomic, retain) Person *
修改PersonDetailViewController.m模板文件
前面更新了头文件,定义了要添加到模板的内容,下面开始修改PersonDetailViewController.m模板。
因为只添加了一个Person类型的contact,所以只需为其添加相应的@synthesize(如程序清单10-48所示)。
程序清单10-48& 添加@synthesize
#import &PersonDetailViewController.h&
#import &Person.h&
@implementation PersonDetailViewController
在viewDidLoad方法中初始化PersonDetailViewController视图时,需要让用户确定视图的功能,因此,需要将导航栏标题指定为Contact Detail(如程序清单10-49所示)。
程序清单10-49& viewDidLoad方法
#pragma mark -
#pragma mark View lifecycle
- (void)viewDidLoad {
&&& [super viewDidLoad];
&&& [self setTitle:@&Contact Detail&];
在显示详细信息时,联系人姓氏和其他内容是分开显示的。要完成该操作,需要定义两个区块。第一个区块存放姓氏;第二个区块存放名字和电话号码。
在分组定义以后,第一个区块只有一行,用于存放姓氏;第二个区块有两行内容,分别存放名字和电话号码(如程序清单10-50所示)。
程序清单10-50& numberOfSectionsInTableView方法和tableView:numberOfRowsInSection方法
#pragma mark -
#pragma mark Table view data source
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
&&& // Return the number of sections.
&&& return 2;
- (NSInteger)tableView:(UITableView *)tableView
&&&&&&&&&&&&&&&&&&&&&&&&&&&& numberOfRowsInSection:(NSInteger)section {
&&& int rows = 0;
&&& if(section == 0) {
&&&&&&& rows = 1;&& // last name only
&&& } else {
&&&&&&& rows = 2;&& // first name and phone number
因为有两个区块,所以需要为每个区块添加一个描述性的标题用于识别(如程序清单10-51所示)。
程序清单10-51& tableView:titleForHeaderInSection方法
// Customize the Header Titles of the table view.
- (NSString *)tableView:(UITableView *)tableView
&&&&&&&&&&&&&&&&&&&&&&&&& titleForHeaderInSection:(NSInteger)section {
&&& NSString *sectionTitle =
&&& switch (section) {
&&&&&&& case 0:
&&&&&&&&&&& sectionTitle = @&Last Name&;
&&&&&&&&&&&
&&&&&&& case 1:
&&&&&&&&&&& sectionTitle = @&Details&;
&&&&&&&&&&&
&&&&&&& default:
&&&&&&&&&&&
&&& return sectionT
第一个区块显示联系人的姓氏。第二个区块中的第一行显示联系人的名字,第二行显示电话号码(如程序清单10-52所示)。
程序清单10-52& tableView:cellForRowAtIndexPath方法
// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView
&&&&&&&& cellForRowAtIndexPath:(NSIndexPath *)indexPath {
&&& int section = [indexPath section];
&&& int row = [indexPath row];
&&& NSString *cellText =
&&& static NSString *CellIdentifier = @&Cell&;
&&& UITableViewCell *cell =
&&&&&& [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
&&& if (cell == nil) {
&&&&&&&& cell = [[[UITableViewCell alloc]
&&&&&&&&&&&&&&&&&&& initWithStyle:UITableViewCellStyleDefault
&&&&&&&&&&&&&&&&&&& reuseIdentifier:CellIdentifier] autorelease];
&&& // Configure the cell...
&&& switch (section) {
&&&&&&& case 0:
&&&&&&&&&&& cellText = [contact lastName];
&&&&&&&&&&&
&&&&&&& case 1:
&&&&&&&&&&& switch (row) {
&&&&&&&&&&&&&&& case 0:
&&&&&&&&&&&&&&&&&&& cellText = [contact firstName];
&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&& case 1:
&&&&&&&&&&&&&&&&&&& cellText = [contact phone];
&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&& default:
&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&& }
&&&&&&& default:
&&&&&&&&&&&
&&& [[cell textLabel] setText:cellText];
至此已经完成了PersonDetailViewController.m类。程序清单10-53显示了完整的实现代码。
程序清单10-53& 完整的PersonDetailViewController.m文件(/Chapter10/CoreDataStorage/Classes/Person-
DetailViewController.m)
#import &PersonDetailViewController.h&
#import &Person.h&
@implementation PersonDetailViewController
#pragma mark -
#pragma mark View lifecycle
- (void)viewDidLoad {
&&& [super viewDidLoad];
&&& [self setTitle:@&Contact Detail&];
#pragma mark -
#pragma mark Table view data source
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
&&& // Return the number of sections.
&&& return 2;
- (NSInteger)tableView:(UITableView *)tableView
&&&&&&&&&&&&&&&&&&&&&&&&&&&& numberOfRowsInSection:(NSInteger)section {
&&& int rows = 0;
&&& if(section == 0) {
&&&&&&& rows = 1;
&&& } else {
&&&&&&& rows = 2;
// Customize the Header Titles of the table view.
- (NSString *)tableView:(UITableView *)tableView
&&&&&&&&&&&&&&&&&&&&&&&& titleForHeaderInSection:(NSInteger)section {
&&& NSString *sectionTitle =
&&& switch (section) {
&&&&&&& case 0:
&&&&&&&&&&& sectionTitle = @&Last Name&;
&&&&&&&&&&&
&&&&&&& case 1:
&&&&&&&&&&& sectionTitle = @&Details&;
&&&&&&&&&&&
&&&&&&& default:
&&&&&&&&&&&
&&& return sectionT
// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView
&&&&&&&&&&&&&&&&&&&&&&&&&&& cellForRowAtIndexPath:(NSIndexPath *)indexPath {
&&& int section = [indexPath section];
&&& int row = [indexPath row];
&&& NSString *cellText =
&&& static NSString *CellIdentifier = @&Cell&;
&&& UITableViewCell *cell =
&&&&&&&&&& [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
&&& if (cell == nil) {
&&&&&&& cell = [[[UITableViewCell alloc]
&&&&&&&&&&&&&&&&&& initWithStyle:UITableViewCellStyleDefault
&&&&&&&&&&&&&&&&&& reuseIdentifier:CellIdentifier] autorelease];
&&& // Configure the cell...
&&& switch (section) {
&&&&&&& case 0:
&&&&&&&&&&& cellText = [contact lastName];
&&&&&&&&&&&
&&&&&&& case 1:
&&&&&&&&&&& switch (row) {
&&&&&&&&&&&&&&& case 0:
&&&&&&&&&&&&&&&&&&& cellText = [contact firstName];
&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&& case 1:
&&&&&&&&&&&&&&&&&&& cellText = [contact phone];
&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&& default:
&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&& }
&&&&&&& default:
&&&&&&&&&&&
&&& [[cell textLabel] setText:cellText];
#pragma mark -
#pragma mark Table view delegate
- (void)tableView:(UITableView *)tableView
&&&&&&&&&&&&&&&&&& didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
#pragma mark -
#pragma mark Memory management
- (void)didReceiveMemoryWarning {
&&& [super didReceiveMemoryWarning];
- (void)viewDidUnload {
&&& [self setContact:nil];
- (void)dealloc {
&&& [contact release];
&&& [super dealloc];
修改Person.h模板文件
使用Person类的一个实例来存储联系人信息。该实例中保存了以下3个值:
为了使用Core Data存储类,必须添加&CoreData/CoreData.h&头文件,并将Person类声明为NSManagedObject的子类。
程序清单10-54显示了完整的Person.h文件。
程序清单10-54& 完整的Person.h文件(/Chapter10/CoreDataStorage/Classes/Person.h)
#import &CoreData/CoreData.h&
@interface Person : NSManagedObject {
@property (nonatomic, retain) NSString *firstN
@property (nonatomic, retain) NSString *lastN
@property (nonatomic, retain) NSString *
修改Person.m模板文件
前面更新了头文件,定义了添加到模板的内容,下面开始修改Person.m模板。只需为每个已经声明的视图属性添加相应的@synthesize即可(如程序清单10-55所示)。
至此完成了Person.m类。程序清单10-55显示了完整的实现代码。
程序清单10-55& 完整的Person.m文件(/Chapter10/CoreDataStorage/Classes/Person.m)
#import &Person.h&
@implementation Person
@synthesize firstN
@synthesize lastN
为一个使用核心数据的简单应用程序创建数据模型
在完成了对用户界面和源代码的设计和修改以后,现在开始定制数据模型模板,在其中添加所需的Person类。
修改CoreDataStorage.xcdatamodel模板文件
如果在第一步的创建基于导航的应用程序时选中了使用核心数据的选项,那么Xcode将自动生成一个默认数据模型。默认状态下会定义以下内容:
Date类的timeStamp属性
为了定制适合本应用程序的数据模型,执行以下步骤:
(1) 在Xcode的Groups&Files窗口中选中Resources选项,然后选择CoreDataStorage.xcdatamodel打开数据建模器(如图10-17所示)。
(2) 在Entity区域选中Entity,然后将Name和Class同时改为Person(如图10-18)。
(3) 在Property区域中选中timestamp,然后将Name改为firstName,并取消选中&Optional&复选框,最后将Type改为String(如图10-19所示)。
(4) 单击底部Property区域的+号按钮,选择Add Attribute选项,为lastName和phone重复上述操作,将其Type设置为String(如图10-20所示)。
(5) 在完成上述步骤以后,该数据模型应该与图10-21类似。
您对本文章有什么意见或着疑问吗?请到您的关注和建议是我们前行的参考和动力&&
您的浏览器不支持嵌入式框架,或者当前配置为不显示嵌入式框架。}

我要回帖

更多关于 ipad3使用说明书 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信