ios7数据添加1——Start Developing iOS Apps Today——从今天开始开发IOS(IOS7版)系列源文档翻译(十九)

本教程建立在之前关于Storyboard创建的项目上。你会使用你所学到如何使用设计模式,与Fundaction的工作,并编写自定义类中添加动态数据支持你的todolist的应用程序。 

本教程教您如何: 

1.与普通基础类工作 

2.创建自定义数据类 

3.实现一个委托和数据源协议 

4.通过视图控制器之间的数据 

5.在您完成本教程中的所有步骤,你就会有一个应用程序,看起来像这样:

ios7数据添加1——Start Developing iOS Apps Today——从今天开始开发IOS(IOS7版)系列源文档翻译(十九) ios7数据添加1——Start Developing iOS Apps Today——从今天开始开发IOS(IOS7版)系列源文档翻译(十九)

创建一个数据类

开始使用,在Xcode中打开现有的项目。
在这一点上,你必须使用Storyboard的todolist的应用程序的界面和导航方案。现在,是时候添加的数据存储,并与模型对象的行为。
您的应用程序的目标是创建待办事项列表,所以首先你要创建一个自定义类, XYZToDoItem ,代表个人待办事项。您可能还记得,在XYZToDoItem类中编写自定义类进行了讨论。

要创建XYZToDoItem类
1.选择File > New > File(或按Command -N ) 。
出现一个对话框,提示您选择新文件的模板。
2.在左侧,选择iOS的下Cocoa Touch。
3.选择的Objective- C类,然后单击下一步。
4.在类领域, XYZ前缀后面键入的TodoItem 。
5.从弹出菜单中的“Subclass of”选择NSObject的。
如果你一直跟随着教程完全相同,类标题大概说XYZToDoItemViewController在此之前的步骤。当您选择NSObject的为“子类”的Xcode知道你正在做一个正常的自定义类,并删除的ViewController文本,它是以前加入。
6.单击下一步。
7.该位置默认保存到您的项目目录。。
8.这组选项默认为您的应用程序的名称, todolist。
9.在目标部分默认为具有用于您的应用程序未选中你的应用选择和测试。
10.单击创建。

该XYZToDoItem类实现起来非常简单。它有其名称,创建日期属性,且该项目是否已经完成。来吧,加入这些属性的XYZToDoItem类接口。

配置XYZToDoItem类 
在项目导航器中,选择XYZToDoItem.h。 
将以下属性添加到接口,这样的声明看起来像这样:
@interface XYZToDoItem : NSObject
 
@property NSString *itemName;
@property BOOL completed;
@property (readonly) NSDate *creationDate;
 
@end

要点:生成项目通过选择Product > Build (或按下Command-B)。你不使用你的新类做任何事,但建设它给编译器一个机会来验证您还没有作出任何打字错误。如果你有,修复它们通过编译器提供的警告或错误读数,再回头看在本教程中的说明,以确保一切看起来它在这里所描述的方法。

添加数据

现在你有一个类,您可以创建和存储为单个列表项的数据。您还需要保留这些项目的列表。自然的地方来追踪这是在XYZToDoListViewController类视图控制器负责模型和视图之间的协调,因此他们需要一个参考模型。 
Foundation框架包含一个类,NSMutableArray里,行之有效的项目跟踪列表。使用可变数组是很重要的,这样用户可以将项目添加到数组中。不可变版本,NSArray的,不允许你将项目添加到它它的初始化之后。 
如果要使用,你需要两个声明并创建一个数组。您可以通过分配和初始化数组做到这一点。

分配和初始化数组 
1.在项目导航器中,选择XYZToDoListViewController.m。 
因为项目的数组是你的表视图控制器的实现细节,你在m文件,而不是。h文件中声明它。这使得它私有的自定义类。 
2将以下属性添加到您的自定义表视图控制器类中创建的接口类的Xcode。该声明应该是这样的:
@interface XYZListViewController ()
 
@property NSMutableArray *toDoItems;
 
@end
3.分配和初始化toDoItems数组中的viewDidLoad方法:
- (void)viewDidLoad
{
    [super viewDidLoad];
    self.toDoItems = [[NSMutableArray alloc] init];
}

为viewDidLoad中的实际代码包含一些额外的行插入由Xcode时,它创建XYZListViewController,被注释掉。欢迎留下他们。 
在这一点上,你有一个数组,你可以添加项目。你会在一个单独的方法,loadInitialData,你会从viewDidLoad中调用做到这一点。这个代码放在自己的方法,因为它是一个模块化的任务,你可以通过使这种方法单独提高代码的可读性。在一个真正的应用程序该方法将加载由某种持久存储的数据,如文件。现在,我们的目标是怎么看的表视图适用于自定义数据项,所以您将创建一些测试数据进行实验。 
分配和初始化:在您创建的阵列的方式创建一个项目。然后,给项目的名称。这是将在表视图中显示出来的名称。做到这一点的几个项目。

加载初始数据
1.添加一个新方法,loadInitialData,下面的@implementation行。
- (void)loadInitialData {
}
2.在这个方法中,创建了几个列表项,并把它们添加到数组中。
- (void)loadInitialData {
    XYZToDoItem *item1 = [[XYZToDoItem alloc] init];
    item1.itemName = @"Buy milk";
    [self.toDoItems addObject:item1];
    XYZToDoItem *item2 = [[XYZToDoItem alloc] init];
    item2.itemName = @"Buy eggs";
    [self.toDoItems addObject:item2];
    XYZToDoItem *item3 = [[XYZToDoItem alloc] init];
    item3.itemName = @"Read a book";
    [self.toDoItems addObject:item3];
}

3.调用loadInitialData在viewDidLoad方法。
- (void)viewDidLoad
{
    [super viewDidLoad];
    self.toDoItems = [[NSMutableArray alloc] init];
    [self loadInitialData];
}

要点:通过选择Product > Build。你应该会看到许多错误您loadInitialData方法的线条。关键什么是第一行,这应该说是“使用未声明的标识符XYZToDoItem。”这意味着,编译器不知道你XYZToDoItem时,它的编译XYZToDoListViewController。编译器是非常特殊的,需要被明确告知有什么要注意。

告诉编译器要注意您的自定义列表项类 
1.找到的#import“XYZToDoListViewController.h”傍边XYZToDoListViewController.m文件的第一行。 
2.添加以下行紧接其下:
#import "XYZToDoItem.h"
要点:通过选择Product > Build生成项目。它应该建立且没有错误。

显示数据

在这一点上,你的表视图都有的预填充一些示例待办事项可变数组。现在,你需要显示在表格视图中的数据。
你会通过使XYZToDoListViewController表视图的数据源做到这一点。为了使一些表视图的数据源,它需要实现UITableViewDataSource协议。事实证明,你需要实现的方法,正是您在第二个教程中注释掉的。有一个功能表视图需要三个方法。其中第一项是numberOfSectionsInTableView : ,它告诉表视图有多少部分显示。对于这个程序,你想要的表视图来显示一个单一的部分,所以实现非常简单。

要显示表中的一个部分
1.在项目导航器中,选择XYZToDoListViewController.m 。
2.如果你注释掉的第二个教程表视图的数据源的方法,现在删除这些注释标记。
3.找到模板实现的部分看起来像这样。
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
#warning Potentially incomplete method implementation.
    // Return the number of sections.
    return 0;
}

你想有一个单一的部分,所以你要删除的警戒线和返回值从0改为1。 
4.更改numberOfSectionsInTableView:数据源方法返回一个单一的部分,像这样:
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    // Return the number of sections.
    return 1;
}

下一个方法,实现代码如下:numberOfRowsInSection:告诉表视图多少行给定的部分中显示。你在你的表中的单个部分,每个待办事项应该在表视图自己的行。这意味着行数应该是XYZToDoItem对象中的toDoItems阵列的数目。 

返回行的表中的数 
1.在项目导航器中,选择XYZToDoListViewController.m。 
2.找到模板实现,它看起来像这样的一样:
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
#warning Incomplete method implementation.
    // Return the number of rows in the section.
    return 0;
}

你想回到你有列表项的数目。幸运的是,NSArray中有一个名为count返回数组中的项目数易用的方法,所以行数是[self.toDoItems count]。 
3.改变实现代码如下:numberOfRowsInSection:数据源方法来返回行的相应数量。
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    // Return the number of rows in the section.
    return [self.toDoItems count];
}
最后一个方法,实现代码如下:cellForRowAtIndexPath : ,要求一个单元格显示为一个给定的行。到现在为止,你已经工作,只有代码,但要显示的行的单元格是你的界面的重要部分。幸运的是, Xcode中可以很容易地设计自定义单元格在Interface Builder 。第一个任务是设计你的手机,并告诉表视图,而不是使用静态内容,它是将要使用的原型细胞与动态内容。

配置您的表视图
1.打开你的storyboard。
2.选择在大纲表视图。
3.与表视图中选择,打开在工具区域中的属性检查器中。
4.在属性检查器中,更改表视图的内容属性,从静态到细胞动态原型。

Interface Builder中你需要配置的静态细胞,并将它们转换成所有的原型。原型细胞,顾名思义,是指配置了文字样式,颜色,图像或其他属性,只要你想他们要显示但在运行时从数据源获取数据的单元格。数据源加载一个原型电池的每一行,然后配置该单元格以显示该行的数据。
加载正确的单元格,数据源需要知道它叫什么,这个名字也必须在脚本配置。
当你设置了原型单元名称,您还可以配置其他物业小区选择的风格,它决定细胞的出现,当用户点击它。设置小区选择样式为无,这样,当一个用户点击了的细胞不会被突出显示。这是你想要当一个用户点击一个项目的待办列表为已完成或尚未完成的 - 一个功能,您将在本教程的后面实施,以纪念它的细胞有行为。

配置原型细胞
1.选择表中的第一个表视图单元格。
2.在属性检查器中,找到标识符字段,然后键入ListPrototypeCell 。
3.在属性检查器中,找到选择字段,然后选择无。

您也可以更改字体或原型细胞的其他属性。基本配置是易于使用,因此你会保持这一点。
下一步是教你的数据源如何通过实施实现代码如下配置单元的给定行:cellForRowAtIndexPath : 。此数据源的方法是所谓的表视图,当它想显示一个给定的行。对于具有少量的行表视图,所有的行可能会在屏幕上一次,所以这种方法被调用的每一行中的表。但有大量行的表视图在一个给定的时间显示其总项目的一小部分。这是最有效的表意见,只要求该单元格所显示的行,而这正是实现代码如下:cellForRowAtIndexPath :允许表视图做。
对于表中的任何给定的行,取toDoItems数组中对应的条目,然后在单元格的文本标签设置为项目的名称。

显示在单元格的表
1.在项目导航器中,选择XYZToDoListViewController.m 。
2.找到实现代码如下:cellForRowAtIndexPath :数据源的方法。模板实现看起来像这样:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
 
    // Configure the cell...
 
    return cell;
}

该模板执行多个任务。它创建了一个变量来保存标识符的单元格,要求与该标识符的单元格的表视图,增加了约其中的代码可以将单元配置应该去一个注释,然后返回该单元格。 
为了使您的应用程序的代码工作,你需要标识符更改为您在脚本设置一个,然后添加代码来配置的单元格。 
3.更改单元格标识符您在脚本设置之一。为了避免错别字,请复制并粘贴到脚本的执行文件。该区标识行现在看起来应该像这样:

static NSString *CellIdentifier = @"ListPrototypeCell";

4.只要return语句之前,添加下面的代码行:

XYZToDoItem *toDoItem = [self.toDoItems objectAtIndex:indexPath.row];
cell.textLabel.text = toDoItem.itemName;
你的tableView:cellForRowAtIndexPath:回事这样的:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"ListPrototypeCell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
    XYZToDoItem *toDoItem = [self.toDoItems objectAtIndex:indexPath.row];
    cell.textLabel.text = toDoItem.itemName;
    return cell;
}
要点:运行您的应用程序。您在loadInitialData添加的项目列表中应该显示为单元格在表视图。




ios7数据添加1——Start Developing iOS Apps Today——从今天开始开发IOS(IOS7版)系列源文档翻译(十九)

上一篇:Qt on Android Episode 1(翻译)


下一篇:ios7编写自定义类2——Start Developing iOS Apps Today——从今天开始开发IOS(IOS7版)系列源文档翻译(十八)