• UITableView, 表视图


    UITableView, 表视图

     

        样式

        1.UITableViewStylePlain, 正常样式

        2.UITableViewStyleGrouped,  分组样式

        行高, 默认44
        tableView.rowHeight = 80;
        分隔线的颜色
        tableView.separatorColor = [UIColor orangeColor];
        tableView.separatorStyle = UITableViewCellSeparatorStyleSingleLine;
        分隔线间距(上 左 下 右)
        tableView.separatorInset = UIEdgeInsetsMake(0, 0, 0, 0);
        表头(重在显示内容)
        UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 375, 40)];
        label.text = @"表        头";
        label.backgroundColor = [UIColor colorWithRed:1.000 green:0.999 blue:0.599 alpha:1.000];
        tableView.tableHeaderView = label;
        label.textAlignment = NSTextAlignmentCenter;
        [label release];
        表尾(重在去除虚拟行数)
    //    UIView *footerView = [[[UIView alloc] initWithFrame:CGRectZero] autorelease];
    //    footerView.backgroundColor = [UIColor colorWithRed:0.741 green:1.000 blue:0.836 alpha:1.000];
    //     [footerView release];
    //    UIView *footerView = [[UIView new] autorelease];
        tableView.tableFooterView = [[UIView new] autorelease];

     附加视图样式

        UITableViewCellAccessoryNone, 无

        UITableViewCellAccessoryDisclosureIndicator, >

    UITableViewCellAccessoryDetailDisclosureButton, ! + >
    UITableViewCellAccessoryCheckmark, √
    UITableViewCellAccessoryDetailButton, !
        数值数据源, 由谁为tableView提供数据
        tableView.dataSource = self;
    - (void)createData {
        1.数组 + 字典
    //    NSDictionary *person1 = @{@"name": @"陈强", @"Phone": @"15776995908"};
    //    NSDictionary *person2 = @{@"name": @"蹦蹦", @"Phone": @"18336394321"};
    //    NSDictionary *person3 = @{@"name": @"炳焱", @"Phone": @"15238841866"};
    //    
    //    self.personArray = [NSMutableArray arrayWithObjects:person1, person2, person3, nil];
        2.数组 + 数据模型
    //    Person *p1 = [Person personWithName:@"小强" teleNumber:@"15776995908"];
    //    Person *p2 = [Person personWithName:@"阿呆" teleNumber:@"14646546486"];
    //    Person *p3 = [Person personWithName:@"阿狸" teleNumber:@"74641356413"];
    //    
    //    self.personArray = [NSMutableArray arrayWithObjects:p1, p2, p3, nil];
        3.分区数据
        //分区1
        Person *p1 = [Person personWithName:@"阿强" teleNumber:@"15776995908"];
        Person *p2 = [Person personWithName:@"阿呆" teleNumber:@"14646546486"];
        Person *p3 = [Person personWithName:@"阿狸" teleNumber:@"74641356413"];
        NSMutableArray *array1 = [NSMutableArray arrayWithObjects:p1, p2, p3, nil];
        //分区2
        Person *p4 = [Person personWithName:@"包强" teleNumber:@"15776995908"];
        Person *p5 = [Person personWithName:@"保呆" teleNumber:@"14646546486"];
        Person *p6 = [Person personWithName:@"宝狸" teleNumber:@"74641356413"];
        Person *p7 = [Person personWithName:@"豹虎" teleNumber:@"54666566583"];
        NSArray *array2 = @[p4, p5, p6, p7];
        //分区3
        Person *p8 = [Person personWithName:@"超强" teleNumber:@"15776995908"];
        Person *p9 = [Person personWithName:@"超呆" teleNumber:@"14646546486"];
        Person *p10 = [Person personWithName:@"曹狸" teleNumber:@"74641356413"];
        Person *p11 = [Person personWithName:@"曹虎" teleNumber:@"54666566583"];
        Person *p12 = [Person personWithName:@"超期" teleNumber:@"54666566583"];
        NSArray *array3 = @[p8, p9, p10, p11, p12];
    
        self.personArray = [NSMutableArray arrayWithObjects:array1, array2, array3, nil];
        
        self.navigationItem.title = @"表视图";
        self.navigationItem.rightBarButtonItem = [[[UIBarButtonItem alloc] initWithBarButtonSystemItem:(UIBarButtonSystemItemRefresh) target:self action:@selector(refresh)] autorelease];
        
    }
    
    - (void)refresh {
        NSMutableArray *array = self.personArray[0];
        if ([self.personArray[0] count] > 0) {
             [array removeObjectAtIndex:0];
        //tableView的数据源发生变化, tableView不会跟着变化, 需要刷新一下tableView
        UITableView *tableView = (UITableView *)[self.view viewWithTag:1028];
        //重新加载数据
        [tableView  reloadData];
        }
    }
    Person.m
    #import "Person.h"
    
    @implementation Person
    
    - (void)dealloc {
        [_name release];
        [_teleNumber release];
        [super dealloc];
    }
    
    - (instancetype)initWithName:(NSString *)name teleNumber:(NSString *)teleNumber {
        self = [super init];
        if (self) {
            self.name = name;
            self.teleNumber = teleNumber;
        }
        return self;
    }
    
    + (instancetype)personWithName:(NSString *)name teleNumber:(NSString *)teleNumber {
        
        return [[Person alloc] initWithName:name teleNumber:teleNumber];
    }
    
    - (NSString *)description
    {
        return [NSString stringWithFormat:@"name:%@ teleNumber:%@", _name, _teleNumber];
    }
    @end

    #pragma mark - UITableViewDataSource
    分区个数, 默认为1
    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
        return self.personArray.count;
    }
    
    分区行数
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
        return [[self.personArray objectAtIndex:section] count];
    }
    
    cell的创建
    当要显示一个cell的时候, 就会执行此方法
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    //    NSLog(@"%s", __FUNCTION__);
        
        NSIndexPath, 继承于NSObject, 用于存储cell的位置(分区和行数)
    //    NSLog(@"%ld, %ld", indexPath.section, indexPath.row);
        
        UITableViewCell, 单元格, 继承于UIView, 用于展示数据
        样式
        1.Default: 左imageView, 右textLabel
        2.value1: 左imageView, 中textLabel, 右detailTextLabel
        3.value2: 左textLabel, 右detailTextLabel
        4.subtitle: 左imageView, 右上textLabel, 右下detailTextLabel
        UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:(UITableViewCellStyleSubtitle) reuseIdentifier:@"辉哥好帅"];
        cell.textLabel.text = [NSString stringWithFormat:@"%ld, %ld", indexPath.section, indexPath.row];
        cell.imageView.image = [UIImage imageNamed:@"li.jpg"];
        cell.detailTextLabel.text = @"我喜欢桃子";
        cell.contentView.backgroundColor = [UIColor colorWithRed:0.665 green:1.000 blue:0.962 alpha:1.000];
        accessoryView, 附加视图
    //    cell.accessoryView =
        附加视图样式
        UITableViewCellAccessoryNone, 无
        UITableViewCellAccessoryDisclosureIndicator, >
        UITableViewCellAccessoryDetailDisclosureButton, ! + >
        UITableViewCellAccessoryCheckmark, √
        UITableViewCellAccessoryDetailButton, !
        cell.accessoryType = UITableViewCellAccessoryDetailButton;
        return [cell autorelease];
    
        重用机制创建cell
        指定重用标识符
        static NSString *string = @"慧慧";
        根据重用标识符, 去重用池中找cell
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:string];
       判断是否找到cell
        if (cell == nil) {
            没有cell, 创建cell
            cell = [[[UITableViewCell alloc] initWithStyle:(UITableViewCellStyleSubtitle) reuseIdentifier:string] autorelease];
            NSLog(@"+++");
        }
        cell赋值
    //    cell.imageView.image = [UIImage imageNamed:@"li.jpg"];
    //    cell.textLabel.text = @"你是我心中的玫瑰花";
        1
        NSDictionary *dic = [self.personArray objectAtIndex:indexPath.row];;
        cell.textLabel.text = [dic objectForKey:@"name"];
        cell.detailTextLabel.text = [dic objectForKey:@"Phone"];
        2
        Person *person = [self.personArray objectAtIndex:indexPath.row];
        cell.textLabel.text = person.name;
        cell.textLabel.text = [[self.personArray objectAtIndex:indexPath.row] name];
        cell.detailTextLabel.text = person.teleNumber;
        NSArray *array = self.personArray[indexPath.section];
        Person *person = array[indexPath.row];
        cell.textLabel.text = person.name;
        cell.detailTextLabel.text = person.teleNumber;
        
        //返回cell
        return cell;
    }
    
    区头标题
    - (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
        NSArray *titleArray = @[@"  A", @"  B", @"  C"];
        return titleArray[section];
    }
    
    区尾标题
    - (NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section {
        return @"";
    }
    
    分区索引标题
    - (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView {
        return @[@"A", @"B", @"C"];
    }
       设置代理, 检测tableView
        tableView.delegate = self;

    #pragma mark - UITableViewDelegate
    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
        NSLog(@"%ld %ld", indexPath.section, indexPath.row);
        DetailViewController *detailVC = [[DetailViewController alloc] init];
        //赋值
        detailVC.person = self.personArray[indexPath.section][indexPath.row];
        [self.navigationController pushViewController:detailVC animated:YES];
        [detailVC release];
    }
    @end
    DetailViewController.m
    #import "DetailViewController.h"
    #import "Person.h"
    @interface DetailViewController ()
    @end
    
    @implementation DetailViewController
    
    - (void)dealloc {
        [_person release];
        [super dealloc];
    }
    - (void)viewDidLoad {
        [super viewDidLoad];
        
        self.view.backgroundColor = [UIColor colorWithRed:0.632 green:1.000 blue:0.968 alpha:1.000];
        self.name 和 _name 的使用场景
        1.赋值时, 使用self.name = @"zhangsan", self.name会调用setter方法, setter方法内部会处理(retain, copy);
        2.取值时, 使用_name, 如果使用self.name, 会调用getter方法, getter方法返回_name, 和直接使用_name是一样, 并且直接使用_name效果会更高一些
        self.navigationItem.title = @"联系人";
        
        UILabel *nameLabel = [[UILabel alloc] initWithFrame:CGRectMake(50, 100, 275, 40)];
        nameLabel.backgroundColor = [UIColor whiteColor];
        nameLabel.text = [NSString stringWithFormat:@" 姓名: %@", _person.name];
        [self.view addSubview:nameLabel];
        [nameLabel release];
        
        UILabel *phoneLabel = [[UILabel alloc] initWithFrame:CGRectMake(50, 170, 275, 40)];
        phoneLabel.backgroundColor = [UIColor whiteColor];
        phoneLabel.text = [NSString stringWithFormat:@" 电话: %@", _person.teleNumber];
        [self.view addSubview:phoneLabel];
        [phoneLabel release];
    }
    
    - (void)didReceiveMemoryWarning {
        [super didReceiveMemoryWarning];
        // Dispose of any resources that can be recreated.
    }
    @end

    UITableView的创建

    1.开辟空间, 设置frame, 指定样式

    2.设置属性(行高, 分隔线, 表头, 表尾)

    3.添加到父视图

    4.释放 

    UITableView的结构

    一个UITableView有一个tableHeaderView, 一个tableFooterView, 多个section

    一个section有多个UITableViewCell, 一个区头, 一个区尾

    一个UITableViewCellcontentViewaccessoryView, 其中contentViewimageView, textLabel, detailTextLabel

    UITableView, 如何展示数据

    1.设置dataSource

    2.遵守协议<UITableViewDataSource>

    3.实现协议方法, 其中有连个方法是required(分区行数, cell的创建)

    通过重用机制创建cell

    1.重用标识符(static)

    2.tableView根据重用标识符去复用池中找cell

    3.判断是否找到cell, 如果没有找到cell, 就创建cell

    4.cell展示数据

    5.返回cell

    UITableViewDataSource中的方法

    1.分区个数

    2.分区的行数

    3.创建cell

    4.区头标题

    5.区尾标题

    6.分区索引标题

    UITableViewDelegate中的方法

    1.选中某一行

    如何为UItableView提供数据源

    数组 + 字典 + 自定义类

    : 当数据源发生变化时, tableView不会跟着改变, 需要重新加载tableView(reloadData)

     

     

    The one who wants to wear a crown must bear the weight!
  • 相关阅读:
    你没听过的乔布斯语录:苹果如果没这么独,可能更成功
    关于Apache mod_rewrite的中文配置、使用和语法介绍(实现URL重写和防盗链功能)
    与调试器共舞
    libxml2.dylb 导致<libxml/tree.h> 老是找不到头文件
    国家气象局提供的天气预报接口(完整Json接口)
    dSYM 文件分析工具
    总结
    1-22
    【图论】
    好像要开始图论了....但搜索还剩了点....
  • 原文地址:https://www.cnblogs.com/OrangesChen/p/4926074.html
Copyright © 2020-2023  润新知