ios7数据添加2——Start Developing iOS Apps Today——从今天开始开发IOS(IOS7版)系列源文档翻译(二十)
标记的项目为已完成
当一个细胞被选中,调用实现代码如下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新增项目的清单是因为细胞在表视图中可见。但是,当你点击的项目,似乎什么都没有发生。为什么不呢?
以表示该项目已完成的一种方法是把一个复选标记旁边。幸运的是,表视图单元格可以在右侧的单元格的配件。默认情况下,没有附件,但是,您可以更改单元格以显示不同的配件,其中之一是一个复选标记。所有您需要做的是设置都是基于待办项目的完成状态。
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一个属性来保存新的待办事项。
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.单击该窗口中的工具栏打开助理编辑右上角的助手按钮。
助理编辑器允许您有一次两个文件打开,从而有可能的执行操作它们 - 例如,绑在你的源文件的属性,在你的接口的对象。
3.在你的脚本中选择文本字段。
4.按下Control键拖拽文本字段中输入您的画布在右边的编辑器中的代码显示,停止拖动略低于在XYZAddToDoItemViewController.m的@接口线路的线路上。
离开其余的选项,因为它们。你的对话框应该像这样:
Xcode中添加必要的代码来XYZAddToDoItemViewController.m的指针存储到文本字段和配置脚本来设置该连接。
1.在你的脚本,打开助理编辑,并设置最右边的窗口XYZAddToDoItemViewController.m。
2.在你的脚本中选择Done(完成)按钮。
3.按下Control键拖拽完成按钮你的画布,在右边的编辑器中的代码显示,停止拖动略低于在XYZAddToDoItemViewController.m您的TextField属性的行上。
4.在出现的对话框中,名称中键入doneButton。
离开其余的选项,因为它们。你的对话框应该像这样:
当用户点击完成按钮,它揭开序幕的展开SEGUE回待办事项清单,这就是你的第二个教程配置的接口。一个赛格瑞执行之前,系统给出参与机会通过调用prepareForSegue准备视图控制器。这正是在您要检查用户是否拍了拍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为基础的应用程序的基础。
回顾
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。