TableView(2)

1.启用tableView的滑动删除 (想让你的用户能从TableView中轻松删除行)

方案:在delegate中实现tableView:editingStyleForRowAtIndexPath:方法,在data source中实现tableView:commitEditingStyle:forRowAtIndexPath: 方法

代码:

- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath{
    UITableViewCellEditingStyle result = UITableViewCellEditingStyleNone;
    if ([tableView isEqual:_myTableView]) {
        result = UITableViewCellEditingStyleDelete;
    }
    return result;
}
-(void)setEditing:(BOOL)editing animated:(BOOL)animated{
    [super setEditing:editing animated:animated];
    [_myTableView setEditing:editing animated:animated];
}

-(void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath{
    if (editingStyle == UITableViewCellEditingStyleDelete) {
        if (indexPath.row < [self.arrayOfRows count]) {//小于行数
            //先删除数据
            [self.arrayOfRows removeObjectAtIndex:indexPath.row];
            //然后删除表视图的cell
            [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationLeft];
        }
    }
}

tableView:editingStyleForRowAtIndexPath:方法能够启动插入删除功能,它被tableView调用,同时它的返回值决定了tableView允许用户做什么操作(插入,删除等)

tableView:commitEditingStyle:forRowAtIndexPath: 必须使用该方法删除数据,也必须要从表中删除行.

deleteRowsAtIndexPaths:withRowAnimation:  实现表视图删除行,第二个参数是删除行时的动画方案

2.在Tableview中构建页眉和页脚

方案:创建一个视图,然后把这个视图分配到tableView 的1个Section的页眉和页脚中.你也可以指定某个页眉或者页脚的高度.

代码:

    我们先创建一个带有tableView 的简单APP.随后我们提供2个标签,它们属于UILable类;一个做页眉,一个做页脚.

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    _myTableView = [[UITableView alloc]initWithFrame:self.view.bounds style:UITableViewStyleGrouped];
    _myTableView.dataSource = self;
    _myTableView.delegate = self;
    _myTableView.autoresizingMask = UIViewAutoresizingFlexibleHeight|UIViewAutoresizingFlexibleWidth;
    [self.view addSubview:_myTableView];
}
- (BOOL)shouldAutorotate{
    return YES;
}
- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    UITableViewCell *result = nil;
    static NSString *CellIdentifier = @"CellIdentifier";
    result = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (result == nil) {
        result = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];

    }
    result.textLabel.text = [NSString stringWithFormat:@"Cell %ld",indexPath.row];
    return result;
}
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
    return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    return 3;
}

然后用UITableViewDelegate定义的2个重要方法来提供一个页眉标签和另一个页脚标签:

tableView:viewForHeaderInSection:

tableView:viewForFooterInSection:

另外我们还能规定页眉页脚的高度,让表视图跟美观,方法:

tableView:heightForHeaderInSection:

tableView:heightForFooterInSection:

下面我们实现这些方法:

#pragma mark - 添加页眉和页脚
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section{
    UILabel *result = nil;
    if ([tableView isEqual:_myTableView] && section == 0) {
        result = [self createLabelWithString:@"Section 1 Header"];
    }
    return result;
}
- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section{
    UILabel *result = nil;
    if ([tableView isEqual:_myTableView] && section == 0) {
        result = [self createLabelWithString:@"Section 1 Footer"];
    }
    return result;
}
- (UILabel *)createLabelWithString:(NSString *)string{
    UILabel *result = [[UILabel alloc]initWithFrame:CGRectZero];
    result.text = string;
    result.backgroundColor = [UIColor clearColor];
    [result sizeToFit];

    return result;
}
//修改页眉页脚的高度
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{
    CGFloat result = 0.0f;
    if ([tableView isEqual:_myTableView] && section == 0) {
        result = 30.0f;
    }
    return result;
}
- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section{
    CGFloat result = 0.0f;
    if ([tableView isEqual:_myTableView] && section == 0) {
        result = 30.0f;
    }
    return result;
}

此时运行程序,会发现页眉页脚视图label 放在了最左面.你可能想通过更改页眉标签的frame解决这个问题,但这个方法行不通.

解决方法是 创建一个通用的UIView,把页眉页脚标签放上面.此时再更改页眉页脚的位置.

修改tableView:viewForHeaderInSection: 和 tableView:viewForFooterInSection:方法的实现过程:

#pragma mark - 添加页眉和页脚
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section{
    UIView *result = nil;
    CGFloat offsetX = 50.0f;
    if ([tableView isEqual:_myTableView] && section == 0) {
        UILabel *label = [self createLabelWithString:@"Section 1 Header"];
        label.frame = CGRectMake(label.frame.origin.x + offsetX, 5.0f, label.frame.size.width, label.frame.size.height);
        CGRect resultFrame = CGRectMake(0.0f, 0.0f, label.frame.size.width + offsetX, label.frame.size.height);
        result = [[UIView alloc]initWithFrame:resultFrame];
        [result addSubview:label];
    }
    return result;
}
- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section{
    UIView *result = nil;
    CGFloat offsetX = 50.0f;
    if ([tableView isEqual:_myTableView] && section == 0) {
        UILabel *label = [self createLabelWithString:@"Section 1 Footer"];
        label.frame = CGRectMake(label.frame.origin.x + offsetX, 5.0f, label.frame.size.width, label.frame.size.height);
        CGRect resultFrame = CGRectMake(0.0f, 0.0f, label.frame.size.width + offsetX, label.frame.size.height);
        result = [[UIView alloc]initWithFrame:resultFrame];
        [result addSubview:label];
    }
    return result;
}

根据以上了解到的方法,我们可以放置图片做页眉页脚.

另外,如果想放入文字作为页眉页脚,可以使用2个更简单的方法:

tableView:titleForHeaderInSection:

tableView:titleForFooterInSection:

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section{
    return @"Section 1 Header";
}
- (NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section{
    NSString *result = nil;
    if ([tableView isEqual:_myTableView] && section == 0) {
        result = @"Section 1 Footer";
    }
    return result;
}

时间: 2024-10-22 07:52:19

TableView(2)的相关文章

TableView的accessoryButtonTappedForRow方法执行的时机

敲代码时遇到了这个问题,别偷懒,写下来备查. 当你在IB中对TableView中的accessory(注意,我说的是cell中的accessory,而不是cell)创建segue时,如果你在VC中同时实现以下3个方法,请问调用的次序是神马!? //1 func tableView(_ tableView: UITableView, accessoryButtonTappedForRowWith indexPath: IndexPath) //2 override func shouldPerfo

IOS TableView详解

一.建立 UITableView DataTable = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, 320, 420)]; [DataTable setDelegate:self]; [DataTable setDataSource:self]; [self.view addSubview:DataTable]; [DataTable release]; 二.UITableView各Method说明 //Section总数 - (NS

设置tableview的滚动范围--iOS开发系列---项目中成长的知识三

设置tableview的滚动范围 有时候tableview的footerview上的内容需要向上拖动界面一定距离才能够看见, 项目中因为我需要在footerviw上添加一个按钮,而这个按钮又因为这个原因点不中,所以找到了解决办法! 添加如下方法即可 -(void)scrollViewDidScroll:(UIScrollView *)scrollView { self.tableView.contentSize = CGSizeMake(0,MZT_SCREEN_HEIGHT); }

tableView cell性能优化

通过一个标识表去缓冲池中寻找可循环利用的cell 如果缓存池找不到可循环利用的cell,创建一个新的cell,给cell贴个标识 给cell设置新的数据 代码如下cellForRowAtIndexPath方法中 //dequeue查找队列 //cell标识,static修饰局部变量:可以保证局部变量只分配一次存储空间 static NSString *ID = @"A"; UITableViewCell *cell = [tableView dequeueReusableCellWit

IOS学习笔记(三)TableVIew

如果有需要跟踪NSArray中的内容,需要重写descriptionWithLocal 方法.首先新建一个NSArray 的Category,在新建出来的.m文件中加入下列代码 - (NSString *)descriptionWithLocal:(id)local { NSMutableString *string = [NSMutableString string]; [string appendString:@"("]; for (id obj in self) { [strin

IOS7 TableView适配

ios7下的app都是全屏的,意思就是所有控制器的view默认都是从屏幕的(0,0)开始. 为了达到全屏效果的app,官方为UIviewController增加了几个属性: 1 @property(nonatomic,assign) UIRectEdge edgesForExtendedLayout NS_AVAILABLE_IOS(7_0); // Defaults to UIRectEdgeAll 2 @property(nonatomic,assign) BOOL extendedLayo

TableView 的那些坑

1. 分割线填满cell宽度, 并且设置分割线的颜色 1.1 利用系统的分割线填充 1.1.1 tableView 设置如下属性 // 给tableView设置如下属性值 tableView.layoutMargins = UIEdgeInsets.zero tableView.separatorInset = UIEdgeInsets.zero 1.1.2 设置完tableView属性你发现执行完可能好一点不过还需要设置cell的一个属性, 并且这个属性一定要在cell 即将显示的时候设置 f

tableView计算动态行高的总结

研究tableView怎么计算动态行高研究了两天一直还不太会,今天最终做出来了想要的效果. 首先.我在网上搜集了非常多资料,各种大神的总结,然后開始看.研究.试验,基本思路都是一样的. 1.一定要将label的numberOfLine设为0 2.获得文字信息所须要的size 3.将label的height设为titleSize.height 4.在- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIn

IOS xib在tableview上的简单应用(通过xib自定义cell)

UITableView是一种常用的UI控件,在实际开发中,由于原生api的局限,自定义UITableViewCell十分重要,自定义cell可以通过代码,也可以通过xib. 这篇随笔介绍的是通过xib自定义cell. 首先通过gif介绍如何创建xib. 然后实现代码部分,要注意的是实现代码的同时要使代码与xib相关联.-如图 下面便是代码,一些解释我在代码中注释了. ViewController.m // // ViewController.m // CX-Xib在tableView中的简单应用

iOS开发-UI (八)TableView

知识点: 1.UITableView使用 2.UITableView分段功能 3.UITableViewCell重用机制 ======================= UITableView使用 1.UITableView作用 2.UITableView创建 - (id)initWithFrame:(CGRect)frame style:(UITableViewStyle)style; UITableViewStyle: UITableViewStylePlain       列表模式 UIT