UITableView的编辑操作

  继续上篇UITableView和UITableViewController

打开BNRItemsViewController.m,在类扩展中添加如下属性:

@property (nonatomic, strong) IBOutlet UIView *headerView;

  在XIB文件中,headerView是最顶层的对象。该视图包含的对象要使用weak引用。

并在implementation部分增加如下方法:

1 - (IBAction)addNewItem:(id)sender {
2
3 }
4
5 - (IBAction)toggleEditingMode:(id)sender {
6
7 }

  File -> New ->File... -> iOS ->User Interface -> Empty,命名为:HeaderView。

选中刚创建的HeaderView.xib,选中File‘s Owner,Identity Inspector -> Custom Class 中的class改为BNRItemsViewController。

在canvas中拖入UIView视图,将其Attributes Inspector的Simulated Metrics设置为如下:

为将该UIView对象完全透明的,选择Attributes Inspector -> View -> Background -> Clear Color。

  调整UIView的大小,再往该视图中添加两个按钮,如下所示:

  按住Control键,点击File‘s Owner,拖到UIView中,与headerView实例变量建立连接。将Edit按钮与toggleEditingMode:建立连接,将New与addNewItem:建立连接。

  我们需要手动添加如下代码,让BNRItemsViewController加载XIB文件:

1 - (UIView *)headerView {
2     // 如果还没加载headerView
3     if (!_headerView) {
4         // 加载HeaderView.xib
5         [[NSBundle mainBundle] loadNibNamed:@"HeaderView" owner:self options:nil];
6     }
7     return _headerView;
8 }

  通过发送loadNibNamed:owner:options:方法给应用程序的bundle,任何对象都能加载一个XIB文件。

  现在需要告诉表视图关于头视图的信息,修改viewDidLoad方法如下:

1 - (void)viewDidLoad {
2     [super viewDidLoad];
3     [self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"UITableViewCell"];
4
5     UIView *header = self.headerView;
6     [self.tableView setTableHeaderView:header];
7 }

  运行程序,结果为:

  修改toggleEditingMode:方法如下:

 1 - (IBAction)toggleEditingMode:(id)sender {
 2     // 现在是否处于编辑模式
 3     if (self.isEditing) {
 4         // 改变按钮的文本为Edit,并关闭编辑模式
 5         [sender setTitle:@"Edit" forState:UIControlStateNormal];
 6         [self setEditing:NO animated:YES];
 7     } else {
 8         // 改变按钮的文本为Done,并开启编辑模式
 9         [sender setTitle:@"Done" forState:UIControlStateNormal];
10         [self setEditing:YES animated:YES];
11     }
12 }

  运行程序,结果为:

  为了实现点击New按钮可添加新项目,修改addNewItem:方法如下:

1 - (IBAction)addNewItem:(id)sender {
2     // 创建一个新的BNRItem,并将其添加到sharedStore中
3     BNRItem *newItem = [[BNRItemStore sharedStore] createItem];
4     // 获取newItem在数组中的位置
5     NSInteger lastRow = [[[BNRItemStore sharedStore] allItems] indexOfObject:newItem];
6     NSIndexPath *indexPath = [NSIndexPath indexPathForRow:lastRow inSection:0];
7     // 将newItem插入表中
8     [self.tableView insertRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationTop];
9 }

  UITableView的dataSource决定表视图显示的行数,要确保UITableView和dataSource的行数要一致。

  当删除一个cell的时候,1)要从UITableView中删除该行;2)将BNRItem从BNRItemStore中删除。

在BNRItemStore.h中,声明新方法如下:

- (void)removeItem:(BNRItem *)item;

在BNRItemStore.m中,实现removeItem:方法如下:

- (void)removeItem:(BNRItem *)item {
    [self.privateItems removeObjectIdenticalTo:item];
}

删除行时,tableView:commitEditingStyle:forRowAtIndexPath:将被发送给dataSource,实现该方法:

 1 - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
 2     // 如果表视图要求进行删除命令
 3     if (editingStyle == UITableViewCellEditingStyleDelete) {
 4         NSArray *items = [[BNRItemStore sharedStore] allItems];
 5         BNRItem *item = items[indexPath.row];
 6         [[BNRItemStore sharedStore] removeItem:item];
 7         // 将该行从表视图中删除,并附带动画
 8         [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
 9     }
10 }


移动行:

在BNRitem.h中添加一个方法,用来改变allItems中items的顺序,方法如下:

- (void)moveItemAtIndex:(NSUInteger)fromIndex toIndex:(NSUInteger)toIndex;

在BNRitem.m的实现代码为:

- (void)moveItemAtIndex:(NSUInteger)fromIndex toIndex:(NSUInteger)toIndex {
    if (fromIndex == toIndex) {
        return;
    }
    BNRItem *item = self.privateItems[fromIndex];
    [self.privateItems removeObjectAtIndex:fromIndex];
    [self.privateItems insertObject:item atIndex:toIndex];
}

tableView:moveRowAtIndexPath:toIndexPath:用于改变一个UITableView中的行。

在BNRItemsViewController.m中添加如下代码:

- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath {
    [[BNRItemStore sharedStore] moveItemAtIndex:sourceIndexPath.row toIndex:destinationIndexPath.row];
}

运行结果如下:

时间: 2024-10-11 06:28:50

UITableView的编辑操作的相关文章

UITableView的编辑模式

UITableView可以分普通模式和Editing模式两种,这里我们着重讨论Editing模式,Editing模式中又分三种操作:Insert.Delete. Reallocted.Insert和Delete针对数据源内容的修改,而Reallocated是针对数据源位置的修改.下面分别讨论. 一.Insert Or Delete 当UITableView接收到 setEditing:animated:时,它会将同样的消息转发给每一个可见行,大致会经历如下步骤,引用至官方: The table

iOS之UITableView带滑动操作菜单的Cell

制作一个可以滑动操作的 Table View Cell 本文翻译自 http://www.raywenderlich.com/62435/make-swipeable-table-view-cell-actions-without-going-nuts-scroll-views 原作者:Ellen Shapiro Apple 通过 iOS 7 的邮件(Mail)应用介绍了一种新的用户界面方案——向左滑动以显示一个有着多个操作的菜单.本教程将会向你展示如何制作一个这样的 Table View Ce

UI基础:UITableView的编辑和移动

相对UITableViiew进行编辑,必须设置代理UITableViewDataSource和UITableViewDelegate.因为需要它们为UITableViiew实现几个必须的方法. UITableView的编辑和移动都遵循四步操作: 1.让tableView处于可编辑状态(UIViewController中的方法) 2.设置哪些行可以编辑(UITableViewDataSource中的方法) 3.设置编辑的样式(UITableViewDelegate中的方法) 4.提交编辑(a.修改

iOS- Swift实现UITableView的常见操作

1.前言 Swift在这就不多介绍了,想必大家都已皆知. 离Swift面世也过了有一个多月的时间. 在闲暇时间我用Swift实现了UITableView的一些常见操作. 基本都是可以用上的,今天在自己的博客里分享给大家. 2.初始化程序入口 初始化程序入口,先给我们的ViewController封装一个导航控制器 !代表不为nil,?表示可nil  (!与?编译器会根据不同的标识来检测 ) 3.新建成员变量,初始化UITableView var tableView : UITableView?

【vim】插入模式与常用编辑操作

vim不像很多编辑器那样一启动便可以直接编辑文本,需要在普通模式按下i, a等键才会进入插入模式进行文本编辑. 如何进入插入模式 以下的命令都会让vim从普通模式切换到插入模式,但命令执行后的字符插入位置有所不同. 命令 执行后的字符插入位置 i  当前字符之前 I  当前行首第一个非空白字符之前  a  当前字符之后 A  当前行尾 s  删除当前字符,光标停留在下一个字符处 S  删除当前行,光标停留在行首 o  在当前行的下方插入一个新行,光标停在新行行首 O  在当前行的上方插入一个新行

【UIKit】UITableView.07 编辑模式

[1]拖动好界面 [2]设置协议,数据源 [3]代码 1.声明可变数组,用来存放所有数据对象 @interface ViewController () @property(nonatomic,strong)NSMutableArray *mydata; @end 2.初始化数据[创建30个对象数据] - (void)viewDidLoad { [super viewDidLoad]; self.mydata=[NSMutableArray array]; for(int i =0;i<30;i+

linux --&gt; VIM的列编辑操作

VIM的列编辑操作 删除列 1.光标定位到要操作的地方. 2.CTRL+v 进入“可视 块”模式,选取这一列操作多少行. 3.d 删除. 插入列 插入操作的话知识稍有区别.例如在每一行前都插入"() ": 1.光标定位到要操作的地方. 2.CTRL+v 进入“可视 块”模式,选取这一列操作多少行. 3.SHIFT+i(I) 输入要插入的内容. 4.ESC 按两次,会在每行的选定的区域出现插入的内容.

notepad++列块编辑操作

1. 同时编辑连续的列区域: 鼠标先在要进行列编辑的起点点击,再同时按shift+alt不放,鼠标在要进行列编辑的结尾区域点击. 2. 在起点到文档结尾所有列插入数据: 鼠标先在要插入数据的位置点击,再按alt+c,在弹出的对话框中输入要插入的数据,确定后就在后面所有列插入数据了. 3. 同时在不连续的列插入数据: 先在菜单:设置-首选项-编辑中,选中"多列编辑"的,如果是英文版本的话,则是选中"multi-editing settings"的"enabl

UITableView处于编辑状态所在页面消失的时候崩溃

当UITableView处于编辑状态,所在页面消失的时候会崩溃. 解决办法: - (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:YES]; //当处于编辑状态页面消失的时候会崩溃 [self.tableView setEditing:NO]; }