zoukankan      html  css  js  c++  java
  • UITableView的使用

    参考:IOS7.0 programming cookbook.

            http://www.cnblogs.com/kenshincui/p/3931948.html

            http://blog.csdn.net/duxinfeng2010/article/details/7725897

     
     
    说明:TableView在sb里面绑定。cell的定义在xib里面。实现了Cell高度自适应。可删除。含有UIRefreshControl控件。长按。drag到最top or bottom。
     
     

    MYTableViewCell.h

    #import <UIKit/UIKit.h>
    
    @interface MYTableViewCell : UITableViewCell
    @property (weak, nonatomic) IBOutlet UIImageView *imgViewLeft;//xib中绑定
    @property (weak, nonatomic) IBOutlet UIImageView *imgViewRight;//xib中绑定
    @property (weak, nonatomic) IBOutlet UIView *txtView;//xib中绑定
    
    @end
    

    MYTableViewCell.m

    #import "MYTableViewCell.h"
    
    @implementation MYTableViewCell
    
    - (void)awakeFromNib {
        // Initialization code
    }
    
    - (void)setSelected:(BOOL)selected animated:(BOOL)animated {
        [super setSelected:selected animated:animated];
    
        // Configure the view for the selected state
    }
    
    @end
    

      MyTableViewCell.xib

     

    ViewController.h

    /* 本例中,tableview是在sb中建立,cell是在xib中建立,主要展现常用的代理函数。
     PS个人更喜欢纯代码*/
    
    #import <UIKit/UIKit.h>
    
    @interface ViewController : UIViewController<UITableViewDelegate,UITableViewDataSource,UIScrollViewAccessibilityDelegate>
    
    @end
    

     ViewController.m

    /* 本例中,tableview是在sb中建立,cell是在xib中建立,主要展现常用的代理函数。
     PS个人更喜欢纯代码*/
    
    #import "ViewController.h"
    #import "MYTableViewCell.h"
    
    @interface ViewController ()
    @property (weak, nonatomic) IBOutlet UITableView *tbView;//从storyboard关联而来,代理也是在storyboard中关联
    @property (strong,nonatomic) NSMutableArray *arr;
    @property (strong,nonatomic) UIRefreshControl *refreshControl;
    @end
    
    @implementation ViewController
    
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        self.arr = [[NSMutableArray alloc]init];
        [self.arr addObject:@[@"1-1",@"1-2"]];
        [self.arr addObject:@[@"I am a very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very long message"]];
        [self.arr addObject:@[@"3-1",@"3-2"]];
        [self.arr addObject:@[@"4-1",@"4-2",@"4-3",@"4-4",@"4-5",@"4-6",@"4-7",@"4-8",@"4-9",@"4-10"]];
    
        
        //refreshControl
        self.refreshControl = [[UIRefreshControl alloc]initWithFrame:CGRectMake(0, 20, 10, 40)];
        [self.refreshControl addTarget:self action:@selector(handleRefresh:) forControlEvents:UIControlEventValueChanged];
        NSLog(@"%@",self.refreshControl);
        
        
        [self.tbView registerNib:[UINib nibWithNibName:NSStringFromClass([MYTableViewCell class]) bundle:nil] forCellReuseIdentifier:@"CELL_CELL"];//若用xib布局
    //    [self.tbView registerClass:[MYTableViewCell class] forCellReuseIdentifier:@"CELL_CELL"];//若用纯代码
        
        //[self.tbView setEditing:YES animated:YES];//设置后,直接删除比较方便
        [self.tbView addSubview:self.refreshControl];
        NSLog(@"%@",self.refreshControl);
        [self.tbView reloadData];
    }
    
    #pragma mark - RefreshControl
    - (void)handleRefresh:(UIRefreshControl *)sender
    {
        NSLog(@"handleRefresh");
        [sender endRefreshing];
        
    }
    
    #pragma mark - TableView
    //Header
    - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
    {
        return 20.0f;
    }
    
    //Header
    - (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
    {
        return nil;
    }
    
    //Rows Number
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
    {
        return _arr.count;
    }
    
    //Cell的界面
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        MYTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"CELL_CELL"];
        /*如果开始注册了,就直接使用dequeueReusableCellXXX函数。
         如果开始未注册,可以使用以下方法:
        MYTableViewCell *cell = [tableVice dequeueReusableCellWithIdentifier:@"CELL_CELL"];
        if(!cell){
            cell = [[UITableViceCell alloc]initWithStyle:UITableViceCellStyleDefault reuseIdentifier:@"CELL_CELL"];
        }
         */
        
        //cell.contentView.backgroundColor = [UIColor redColor];//尽量吧所有控件家在contentView中,而不是cell中
        //cell.selectedBackgroundView = [[UIView alloc]init];//设置选中时候的背景View
        //cell.selectionStyle = UITableViewCellSelectionStyleNone;//选中时的效果,自己试
        //cell.selectionStyle = UITableViewCellSelectionStyleGray;//选中时的效果,自己试
        //cell.accessoryType = UITableViewCellAccessoryCheckmark;//accesory 类型
        
        /*自适应高度的处理,感觉不断remove add效率很低,有待新解决方案*/
        NSArray *arrSubView = cell.txtView.subviews;
    
        for (UIView *viewElement in arrSubView) {
            [viewElement removeFromSuperview];
        }
    
        NSArray *arrSub = _arr[indexPath.row];
        CGFloat height = 0.0f;
        for (NSString *strElement in arrSub) {
            NSDictionary *attr = @{NSFontAttributeName:[UIFont systemFontOfSize:14.0f]};
            //根据显示的宽度、字符串、字体三者来决定自适应高度,数字80左右两个图片的宽度综合
            CGSize size = [strElement boundingRectWithSize:CGSizeMake(self.tbView.frame.size.width - 80,MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin attributes:attr context:nil].size;
            height += size.height;
            
            UILabel *lbl = [[UILabel alloc]init];
            [lbl.layer setBorderWidth:1.0f];
            lbl.font = [UIFont systemFontOfSize:14.0f];
            [lbl.layer setBorderColor:[[UIColor grayColor]CGColor]];
            lbl.frame = CGRectMake(0, height - size.height, self.tbView.frame.size.width - 80, size.height);
    
            lbl.textColor = [UIColor blackColor];
            lbl.text = strElement;
            lbl.numberOfLines = 0;
            [cell.txtView addSubview:lbl];
        }
        
        return cell;
    }
    
    //Cell的高度(此处添加了自适应高度)
    - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        NSArray *arrSub = _arr[indexPath.row];
        CGFloat height = 0.0f;
        NSDictionary *attr = @{NSFontAttributeName:[UIFont systemFontOfSize:14.0f]};
        
        for (NSString *strElement in arrSub) {
            //根据显示的宽度、字符串、字体三者来决定自适应高度,数字80左右两个图片的宽度综合
            CGSize size = [strElement boundingRectWithSize:CGSizeMake(self.tbView.frame.size.width - 80,MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin attributes:attr context:nil].size;
            height += size.height;
        }
        
        return MAX(40, height);
    }
    
    //When Click
    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
    {
        [self.tbView deselectRowAtIndexPath:indexPath animated:YES];//取消indexPath的被选择状态
    }
    
    //when scroll to the top or bottom
    - (void)tableView:(UITableView *)tableView didEndDisplayingCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
    {
        //NSLog(@"to top or bottom");
    }
    
    //在Cell出现之前响应
    - (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
    {
        //NSLog(@"%ld-%ld",indexPath.section,indexPath.row);
    }
    
    #pragma mark - TableView long press
    
    //长按
    - (BOOL)tableView:(UITableView *)tableView shouldShowMenuForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        return YES;
    }
    
    - (BOOL)tableView:(UITableView *)tableView canPerformAction:(SEL)action forRowAtIndexPath:(NSIndexPath *)indexPath withSender:(id)sender
    {
        //也可以自定义菜单,用UIButton组即可
        if(action==@selector(copy:))
            return YES;
        return NO;
    }
    
    - (void)tableView:(UITableView *)tableView performAction:(SEL)action forRowAtIndexPath:(NSIndexPath *)indexPath withSender:(id)sender
    {
        if(action==@selector(copy:)){
            //NSLog(@"copied");
        }
    }
    
    #pragma mark - TableView delete
    - (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
    {
        return YES;
    }
    
    - (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        return UITableViewCellEditingStyleDelete;
    }
    
    -(NSString *)tableView:(UITableView *)tableView titleForDeleteConfirmationButtonForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        return @"MyDelete";
    }
    
    - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
    {
        //NSLog(@"deleted");
        if(editingStyle == UITableViewCellEditingStyleDelete){
            //以下两句话顺序不可反
            [self.arr removeObjectAtIndex:indexPath.row];
            [tableView deleteRowsAtIndexPaths:@[indexPath]
                               withRowAnimation:UITableViewRowAnimationLeft];
        }
    }
    
    #pragma mark - scrollDelegate
    //开始drag
    - (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
    {
        //NSLog(@"begin drag");
    }
    
    //drag过程
    - (void)scrollViewDidScroll:(UIScrollView *)scrollView
    {
        //NSLog(@"%f",self.tbView.contentOffset.y);
    }
    
    //结束drag
    - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
    {
        //NSLog(@"end drag");
    }
    
    
    @end
    

      

      

    补充1:自定义accessoryView的方式(ios7 cookbook ch4.3)

     补充2: UIRefreshControl控件尽管没有设定frame以及autoresizing,但是其位置总是在头部居中。原因是:

    UIRefreshControl.h文件里面下面说明:

    NS_CLASS_AVAILABLE_IOS(6_0) @interface UIRefreshControl : UIControl 

    /* The designated initializer

     * This initializes a UIRefreshControl with a default height and width.

     * Once assigned to a UITableViewController, the frame of the control is managed automatically.

     * When a user has pulled-to-refresh, the UIRefreshControl fires its UIControlEventValueChanged event.

     *

    */

     

     补充3: 如果TableView是在xib中创建,那么绑定的dataDelegate与Delegate的时候,是绑定到fileOwner的。

     

     补充4:使分割线充满

    - (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {

        if ([cell respondsToSelector:@selector(setSeparatorInset:)]){

            [cell setSeparatorInset:UIEdgeInsetsZero];

        }

        if ([cell respondsToSelector:@selector(setPreservesSuperviewLayoutMargins:)]){

            [cell setPreservesSuperviewLayoutMargins:NO];

        }

        if ([cell respondsToSelector:@selector(setLayoutMargins:)]){

            [cell setLayoutMargins:UIEdgeInsetsZero];

        }

    }

     

  • 相关阅读:
    谷歌阅读器将于2013年7月1日停止服务,博客订阅转移到邮箱
    SelfIntroduction
    WCF(四) Configuration file (配置文件)
    亚当与夏娃的礼物
    WCF(三) Message pattern
    面试小题
    分内分外
    C#多线程处理之AutoResetEvent和ManualResetEvent
    WCF(五) Host WCF Service
    ARX中的Purge
  • 原文地址:https://www.cnblogs.com/dongfangchun/p/5340409.html
Copyright © 2011-2022 走看看