UITableViewCell 加载、添加、删除

1.1 加载:

UITableViewCell 的加载需要遵守UITableViewDataSource数据源协议中的三个方法:

@protocol UITableViewDataSource<NSObject>
@required

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;

// Row display. Implementers should *always* try to reuse cells by setting each cell‘s reuseIdentifier and querying for available reusable cells with dequeueReusableCellWithIdentifier:
// Cell gets various attributes set automatically based on table (separators) and data source (accessory views, editing controls)

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;

@optional

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView;              // Default is 1 if not implemented

  1.2 滑动删除:

  只实现系统自带的滑动删除功能 只需要实现数据源下面一个方法:

// After a row has the minus or plus button invoked (based on the UITableViewCellEditingStyle for the cell), the dataSource must commit the change
// Not called for edit actions using UITableViewRowAction - the action‘s handler will be invoked instead
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath;
/**
 *  如果实现了这个方法,就自动实现了滑动删除的功能
 *  点击了删除按钮就会调用
 *  提交了一个编辑操作就会调用(操作:删除\添加)
 *  @param editingStyle 编辑的行为
 *  @param indexPath    操作的行号
 */
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath{
    if(editingStyle == UITableViewCellEditingStyleDelete){
        [self.contactList removeObjectAtIndex:indexPath.row];

        [self.tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationTop];

        // 更新数据至文件
        BOOL isSuccess = [NSKeyedArchiver archiveRootObject:self.contactList toFile:self.docPath];
        NSLog(@"%@",[email protected]"保存成功":@"保存失败");
    }else if (editingStyle == UITableViewCellEditingStyleInsert){
        // 添加行 一般很少使用这种方式
        HJContact *contact = [[HJContact alloc] init];
        contact.name = @"电信";
        contact.tel = @"10000";
        [self.contactList insertObject:contact atIndex:indexPath.row+1];

        // 刷新表格
        NSIndexPath *indexPathInsert = [NSIndexPath indexPathForRow:indexPath.row+1 inSection:0];
        [self.tableView insertRowsAtIndexPaths:@[indexPathInsert] withRowAnimation:UITableViewRowAnimationTop];
    }
}

这样就可以实现cell滑动删除

  1.3 编辑模式下的删除、添加

  如果不滑动,通过点击系统自带的添加和删除按钮进行添加、删除操作 那么得让表格的可编辑属性为YES才行,比如:点击一个按钮后让表格进入编辑模式:

#warning 导航栏删除按钮方法
- (void)cellDelete{
    NSLog(@"%s",__func__);
//    self.tableView.editing = !self.tableView.editing;
    [self.tableView setEditing:!self.tableView.editing animated:YES];
}

此时cell会进行编辑模式,接着会调用下面方法

#pragma mark tableView代理方法
/**
 *  当tableView进入编辑状态的时候会调用,询问每一行进行怎样的操作(添加\删除)
 */
- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath
{
    return indexPath.row %2 ? UITableViewCellEditingStyleDelete : UITableViewCellEditingStyleInsert;
}

注意:这个两个方法,一个只是让表格可编辑,接着调用

- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath
方法,告诉tableView那些行是删除或添加,然后再接着调用
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath

真正的添加、删除操作都在此方法中进行.

 
时间: 2024-10-24 06:48:08

UITableViewCell 加载、添加、删除的相关文章

ViewPager动态加载、删除页面

很多人在网上说ViewPager的PagerAdapter.notifyDataSetChanged()无效.刚开始我也这样认为,甚至被误导以为是真理. 后来,找了一下,在PagerAdatpar重写getItemPosition(),return POSITION_NONE即可每次刷新加载图面.这是关键点. 这时,如果只是修改"DataSet",如List等这类的,然后再notifyDataSetChanged(),会发现出现界面重叠.解决办法是重写destroyItem(),把Vi

(ViewPager+Fragment)动态加载、删除页面,Fragmen中嵌套使用ViewPager

1.(ViewPager+Fragment)动态加载.删除页面 a.首先adapter要继承FragmentStatePagerAdapter. b.在PagerAdatpar重写getItemPosition(),return POSITION_NONE 即可每次刷新加载图面. 2.Fragmen中嵌套使用ViewPager 和activity中一样使用,将传入的getSupportFragmentManager替换成getChildFragmentManager即可.

数据更新+加载列表+删除数据

此项目实例为springMVCDB 一.数据检索更新 分析:要实现的效果是在第一个页面文本框中输入一个数值,点击检索,然后在第二个页面的文本框中显示.然后在这个文本框中输入新数据,点击更新按钮,数据库中的文件及文本框中的数据被改写.需要注意的是此操作是检索的userid,而要更新的则是它对应的username的值. 功能实现思路: 先实现数据更新,即在控制中用searchUser的方法实例化一个存放结果集的bean.然后是进行数据改写,就是实例化一个update的方法,将结果给bean.并用一个

ajax bookstrap美化网页,并实现页面的加载,删除与查看详情

Bookstrap:美化页面: Bootstrap是Twitter推出的一个开源的用于前端开发的工具包.它由Twitter的设计师Mark Otto和Jacob Thornton合作开发,是一个CSS/HTML框架.Bootstrap提供了优雅的HTML和CSS规范,它即是由动态CSS语言Less写成.Bootstrap一经推出后颇受欢迎,一直是GitHub上的热门开源项目,包括NASA的MSNBC(微软全国广播公司)的Breaking News都使用了该项目.只需要引用一些定义好的类,也就是c

频繁加载、删除swf造成flash崩溃解决办法

最近在项目中遇到flash崩溃问题,经分析,都是在swfobject.embedSWF这一步卡死,页面及flash均无反应. 造成此问题的场景是,在同一根节点上频繁清空节点.调用swfobject.embedSWF嵌入flash. 解决办法:最终在每次嵌入swf之前加个延迟解决问题,给flash点时间清理自己:) setTimeout(embed,200);

jquery实现页面加载时删除特定class 的div内前三个字符

jQuery(document).ready(function(){        jQuery("div.groupheader").each(function(){ $(this).text($(this).text().substr(3));      });});

通过应用程序域AppDomain加载和卸载程序集

微软装配车的大门似乎只为货物装载敞开大门,却将卸载工人拒之门外.车门的钥匙只有一把,若要获得还需要你费一些心思.我在学习Remoting的时候,就遇到一个扰人的问题,就是Remoting为远程对象仅提供Register的方法,如果你要注销时,只有另辟蹊径.细心的开发员,会发现Visual Studio.Net中的反射机制,同样面临这个问题.你可以找遍MSDN的所有文档,在Assembly类中,你永远只能看到Load方法,却无法寻觅到Unload的踪迹.难道我们装载了程序集后,就不能再将它卸载下来

Framework7学习笔记之 无限滚动(滚动到底部时加载新内容)

一:为页面添加无限滚动控件 在可滚动的容器上(一般为page-content)添加"infinite-scroll"类:在页面底部定义 加载指示器. <div class="page"> <div class="page-content infinite-scroll" data-distance="100"> ... <!-- 加载提示符 --> <div class="i

Android之 RecyclerView,CardView 详解和相对应的上拉刷新下拉加载

随着 Google 推出了全新的设计语言 Material Design,还迎来了新的 Android 支持库 v7,其中就包含了 Material Design 设计语言中关于 Card 卡片概念的实现 -- CardView.RecyclerView也是谷歌V7包下新增的控件,用来替代ListView的使用,在RecyclerView标准化了ViewHolder类似于ListView中convertView用来做视图缓存. RecyclerView的优点就是,他可以通过设置LayoutMan