iOS开发脚踏实地学习day06--tableView,汽车品牌


1.注意的数据用建模的方式,直接用数组取出的对象是id类型,不能用点语法,可以分开写,或是用getter方法。

iOS开发脚踏实地学习day06--tableView,汽车品牌_第1张图片


2.关于代理的小结

@required 必须实现的方法
@optional 可选的实现方法

1.遵守协议,预先定义好方法,不实现,具体的实现工作由代理负责
<控件的名字+DataSource> 定义的与数据源有关的方法
<控件的名字+Delegate> 定义的与事件有关的方法,通常用来监听控件的事件。

2.代理方法
1>方法名以控件名开头(没有类前缀)-> 方便程序员编写的时候,快速找到需要的协议方法;
2> 第一个参数是自己 -> 意味着在协议方法中,可以直接访问对象的属性,或者调用方法;
3>代理方法的返回值 -> 控制器(代理)向控件(委托)发送数据


3.UITableView的行高设置效率。

//UITableViewDelegate的协议方法,行高默认是44,代理设置行高的优先级高于属性rowHeight
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    //适用于行高不同的情况,但是效率不高
    return (indexPath.row % 2) ? 60 : 44;
    
    // 以下代码可以使用rowHeight属性替换!,若是每行高度相同,则用属性来修改高度值,效率高。
    //    return 60;
}

4.UITableView内存优化方法

用优化方法,假设页面上同时显示的是5个单元格,那么上下拉动时,会重用单元格,不会分配新的内存空间,总共需要5个内存空间;

普通方法,假设总共有100个单元格,每次都要分配新的内存空间,最多需要100个内存空间。

    //优化方法,重复利用内存空间
    //可重用标示符字符串
    //static静态变量,可以保证系统为变量只分配一次内存空间
    //静态变量,一旦被创建,就不会被释放,只在程序被销毁时才会被释放!
    static NSString *ID = @"CELL";
    
    //dequeueReusableCellWithIdentifier是实例方法,从缓存池中取出可重用的单元格
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];
    if (cell == nil) {
        //如果没有,实例化新的单元格
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:ID];
    }
    
    //用下句,每次都要分配新的内存空间
    //    UITableViewCell *cell =[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:nil];

5.tableView的右侧索引

//右侧索引
-(NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView{
    //索引数组的下标对应的是分组的下标
    
//    NSMutableArray *arrayM = [NSMutableArray array];
//    for (CarGroup *group in self.carGroup) {
//        [arrayM addObject:group.title];
//    }
//    return  arrayM;
    
    //KVC方法是cocoa的大招
    //用来间接获取或是修改对象的属性的方法
    //用KVC时,如果指定对象不包含keyPath的“键名”,则会进入对象的内部查找
    //如果取值的对象是一个数组,同样返回的是一个数组
    return [self.carGroup valueForKey:@"title"];
}

6.自定义代理

#import 
@class HMAppInfo, HMAppView;//提前声明一下HMAppView

// 1. 协议名以类名开始+Delegate
@protocol HMAppViewDelegate  

@optional  //表明是可选的方法,对应的是@required,必须实现的方法
// 2. 协议方法,以类名开始(没有类前缀),第一个参数是自己
// 只是定义方法名,不做具体实现
- (void)appViewDidClickDownloadButton:(HMAppView *)appView;

@end

@interface HMAppView : UIView

// 3. 定义代理属性,遵守了HMAppViewDelegate协议的任意一个对象,都可以成为代理
@property (nonatomic, weak) id delegate;

/** 类方法,方便调用视图 */
+ (instancetype)appView;
/** 实例化视图,并使用appInfo设置视图的显示 */
+ (instancetype)appViewWithAppInfo:(HMAppInfo *)appInfo;

// 自定义视图中显示的数据来源是数据模型
// 使用模型设置自定义视图的显示
@property (nonatomic, strong) HMAppInfo *appInfo;

@end


你可能感兴趣的:(脚踏实地学习iOS)