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

标记的项目为已完成

待办事项列表不是多好,如果为已完成你永远无法标记的项目。现在,您将添加该支持。一个简单的界面将有完成状态切换的时候用户点击单元格,并带有复选标记在他们旁边显示已完成的项目。幸运的是,表视图配备了一些内置的行为,你可以充分利用来实现这个简单的接口,具体而言,表视图通知其委托当用户点击一个单元格。因此,这项任务是编写将要攻表中的待办事项响应用户的代码。
Xcode中已经取得XYZToDoListViewController当您在脚本配置它的表视图的委托。所有您需要做的就是实现了实现代码如下tableView:didSelectRowAtIndexPath:委托方法来响应用户的水龙头,并适当地更新你的待办事项清单项目。
当一个细胞被选中,调用实现代码如下tableView:didSelectRowAtIndexPath:委托方法,看看应该如何处理选择。在此方法中,您将编写代码来更新待办项目的完成状态。
要为已完成或尚未完成的标志项目
1.在项目导航器中,选择XYZToDoListViewController.m 。
2.将下列语句添加到文件的末尾,略高于@end行:
#pragma mark - Table view delegate
 
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
 
}
尝试输入,而不只是复制和粘贴的第二行。你会发现,代码完成是Xcode的伟大节省时间的功能之一。在Xcode中带来了潜在落成的列表,在列表中滚动,直到找到你想要的,然后按回车键。 Xcode中插入整行给你。 
3.你要应对的头部,但实际上并不那么请选中该单元格。添加下面的代码选择后立即取消选择的单元格:
[tableView deselectRowAtIndexPath:indexPath animated:NO];

4.查找您toDoItems数组中的对应XYZToDoItem。
XYZToDoItem *tappedItem = [self.toDoItems objectAtIndex:indexPath.row];
5切换tapped项目的完成状态。
tappedItem.completed = !tappedItem.completed;
6.告诉表视图重新加载其数据刚刚更新的行。
[tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone];
你的tableView:didSelectRowAtIndexPath:方法应该这样:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    [tableView deselectRowAtIndexPath:indexPath animated:NO];
    XYZToDoItem *tappedItem = [self.toDoItems objectAtIndex:indexPath.row];
    tappedItem.completed = !tappedItem.completed;
    [tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone];
}

要点:运行您的应用程序。您在loadInitialData新增项目的清单是因为细胞在表视图中可见。但是,当你点击的项目,似乎什么都没有发生。为什么不呢?

其原因是,你还没有配置表视图单元格显示项目的完成状态。要做到这一点,你需要回到实现代码如下tableView:cellForRowAtIndexPath: 方法和配置单元当一个项目完成后,显示的指标。 
以表示该项目已完成的一种方法是把一个复选标记旁边。幸运的是,表视图单元格可以在右侧的单元格的配件。默认情况下,没有附件,但是,您可以更改单元格以显示不同的配件,其中之一是一个复选标记。所有您需要做的是设置都是基于待办项目的完成状态。

要显示一个项目的完成状态 
1.转到tableView:cellForRowAtIndexPath:方法。 
2.添加下面的代码正下方,设置单元格的文本标签的行:
if (toDoItem.completed) {
    cell.accessoryType = UITableViewCellAccessoryCheckmark;
} else {
    cell.accessoryType = UITableViewCellAccessoryNone;
}

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;
    if (toDoItem.completed) {
        cell.accessoryType = UITableViewCellAccessoryCheckmark;
    } else {
        cell.accessoryType = UITableViewCellAccessoryNone;
    }
    return cell;
}

要点:运行您的应用程序。您在loadInitialData新增项目的清单是因为细胞在表视图中可见。当您点击一个项目,一个复选标记应该出现在它旁边。如果你再次点击相同的项目,复选标记消失。

添加新项目

在创建待办列表应用程序的功能的最后一步是实现以新增项目的能力。当用户输入在文本字段中的项目名称上XYZAddToDoItemViewController场景,Done按钮,你想要的视图控制器来创建一个新的列表项,并通过它回到XYZToDoListViewController在待办事项列表中显示。
首先,你需要有一个列表项来配置。正如表视图,视图控制器的接口连接到模型的合理位置。给XYZAddToDoItemViewController一个属性来保存新的待办事项。

将XYZToDoItem添加到XYZAddToDoItemViewController类
1.在项目导航器中,选择XYZToDoListViewController.h 。
因为你需要从你的表视图控制器访问列表项以后,重要的是使这个公共财产。这就是为什么你在接口文件中, XYZAddToDoItemViewController.h在实现文件中, XYZAddToDoItemViewController.m声明代替它。
2.添加进口报关上面的@接口线的XYZToDoItem类。
#import "XYZToDoItem.h"
3.在接口中添加toDoItem
@interface XYZAddToDoItemViewController : UIViewController
 
@property XYZToDoItem *toDoItem;
 
@end

要获得新项目的名称,视图控制器需要访问用户在其中输入名称的文本字段的内容。要做到这一点,创建连接到文本字段中的Storyboard从XYZAddToDoItemViewController类的连接。 
该文本字段连接到您的视图控制器 

1.在大纲视图中,选择XYZAddToDoItemViewController对象。 
2.单击该窗口中的工具栏打开助理编辑右上角的助手按钮。
ios7数据添加2——Start Developing iOS Apps Today——从今天开始开发IOS(IOS7版)系列源文档翻译(二十)
在右边的编辑器应该会出现XYZAddToDoItemViewController.m显示。如果未显示,请单击文件名在右边的编辑器,并选择XYZAddToDoItemViewController.m。 
助理编辑器允许您有一次两个文件打开,从而有可能的执行操作它们 - 例如,绑在你的源文件的属性,在你的接口的对象。 
3.在你的脚本中选择文本字段。 
4.按下Control键拖拽文本字段中输入您的画布在右边的编辑器中的代码显示,停止拖动略低于在XYZAddToDoItemViewController.m的@接口线路的线路上。
ios7数据添加2——Start Developing iOS Apps Today——从今天开始开发IOS(IOS7版)系列源文档翻译(二十)
5.在出现的,对于名称,TextField类型的对话框。 
离开其余的选项,因为它们。你的对话框应该像这样:
ios7数据添加2——Start Developing iOS Apps Today——从今天开始开发IOS(IOS7版)系列源文档翻译(二十)
6.单击连接。 
Xcode中添加必要的代码来XYZAddToDoItemViewController.m的指针存储到文本字段和配置脚本来设置该连接。

此外,你需要知道什么时候创建的项目。您希望创建只有完成按钮被窃听的项目。要做到这一点,添加完成按钮作为一个出口。 

完成按钮连接到您的视图控制器 
1.在你的脚本,打开助理编辑,并设置最右边的窗口XYZAddToDoItemViewController.m。 
2.在你的脚本中选择Done(完成)按钮。 
3.按下Control键拖拽完成按钮你的画布,在右边的编辑器中的代码显示,停止拖动略低于在XYZAddToDoItemViewController.m您的TextField属性的行上。 
4.在出现的对话框中,名称中键入doneButton。 
离开其余的选项,因为它们。你的对话框应该像这样:
ios7数据添加2——Start Developing iOS Apps Today——从今天开始开发IOS(IOS7版)系列源文档翻译(二十)
5.点击连接

您现在有一个方法来识别完成按钮。因为你要创建一个项目时被窃听Done按钮,你需要知道什么时候出现这种情况。 
当用户点击完成按钮,它揭开序幕的展开SEGUE回待办事项清单,这就是你的第二个教程配置的接口。一个赛格瑞执行之前,系统给出参与机会通过调用prepareForSegue准备视图控制器。这正是在您要检查用户是否拍了拍Done按钮的点,如果是这样,创建一个新的待办事项。您可以检查哪些按钮之一得到了挖掘,如果它是完成按钮,创建该项目。 

以攻Done按钮后创建项目 
1.在项目导航器中选择XYZAddToDoItemViewController.m。 
2.添加prepareForSegue:下面的@行实现方法:
- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
}
3.在该方法中,看到Done按钮是否被窃听。 
而不是保存的项目如果不是,你想而不做其他任何返回的方法。
if (sender != self.doneButton) return;

4.看是否有在文本字段中的文本。
if (self.textField.text.length > 0) {
}
5.如果有文本,创建一个新的项目,并给它在文本字段中的文本的名称。此外,确保完成状态设置为NO。
self.toDoItem = [[XYZToDoItem alloc] init];
self.toDoItem.itemName = self.textField.text;
self.toDoItem.completed = NO;

如果没有文字,你不希望保存的项目,这样你就不会做别的。 
你的prepareForSegue:方法应该是这样的:
- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if (sender != self.doneButton) return;
    if (self.textField.text.length > 0) {
        self.toDoItem = [[XYZToDoItem alloc] init];
        self.toDoItem.itemName = self.textField.text;
        self.toDoItem.completed = NO;
    }
}

现在,您已经创建了一个新的项目,你需要通过项目回XYZToDoListViewController ,以便它可以将项目添加到待办事项列表。要做到这一点,你需要重新审视的unwindToList :您在第二个教程写的方法。这种方法被称为XYZAddToDoItemViewController现场关闭时,当用户点击任何取消或完成按钮的情况。
该unwindToList :方法接受一个segue作为参数,这样的作为目标的展开SEGUE的所有方法。该赛格瑞参数是从开卷XYZAddToDoItemViewController回XYZToDoListViewController的SEGUE 。因为segue是两个视图控制器之间的过渡,它知道它的源代码视图控制器XYZAddToDoItemViewController的。通过询问SEGUE对象其源视图控制器,您可以访问存储在unwindToList源视图控制器的任何数据:方法。在这种情况下,您要访问的TodoItem 。如果是nil,该项目一直没有建立,无论是文本字段没有任何文字或用户点击取消按钮。如果有针对的TodoItem值,则检索该项目,把它添加到你的toDoItems阵列,并通过重新加载在表视图中的数据在待办事项列表中显示它。

存储和显示的新项目

1.在项目导航器中,选择XYZToDoListViewController.m 。
2.添加进口报关上面的@interface行的XYZAddToDoItemViewController类。
#import "XYZAddToDoItemViewController.h"
3.找到unwindToList:您在第二个教程中添加方法。 
4.在此方法中,检索您是从,XYZAddToDoItemViewController解除源视图控制器的控制器。
XYZAddToDoItemViewController *source = [segue sourceViewController];

5.获取控制器的待办事项。
XYZToDoItem *item = source.toDoItem;
这是完成按钮被窃听时创建的项目。 
6.看到该项目是否存在。
if (item != nil) {
}

如果是nil,要么取消按钮关闭屏幕或文本字段没有文字,所以你不希望保存的项目。
如果它确实存在,将项目添加到您的toDoItems阵列。
[self.toDoItems addObject:item];

7.刷新在你的表中的数据。 
因为表视图不跟踪它的数据,它的数据源,在这种情况下的责任,你的表视图控制器来通知表视图时,有它来显示新的数据。
[self.tableView reloadData];

你的unwindToList:方法应该是这样的:
- (IBAction)unwindToList:(UIStoryboardSegue *)segue
{
    XYZAddToDoItemViewController *source = [segue sourceViewController];
    XYZToDoItem *item = source.toDoItem;
    if (item != nil) {
        [self.toDoItems addObject:item];
        [self.tableView reloadData];
    }
}

要点:运行您的应用程序。现在,当您单击添加按钮(+),并创建一个新的项目,你应该看到它在你的待办事项清单。恭喜!您已经创建了一个应用程序,需要来自用户的输入,它存储在一个对象,并传递两个视图控制器之间的对象。这是移动的场景之间的数据在Storyboard为基础的应用程序的基础。

回顾

你几乎与开发iOS应用程序的这篇介绍巡演做。最后一节为您提供了关于如何发现身边的文档你走的更多信息,并提出了一些你可能需要为你将学习如何创建更高级的应用程序的下一个步骤。

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

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


下一篇:Android UI Layout总结之5大布局