一、直接看Bug:unable to dequeue a cell with identifier cell_id - must register a nib or a class for the identifier or connect a prototype cell in a storyboard
二、使用tableView的cell重用机制后cell中不显示detailTextLabel。
*
* 本文中大量涉及tableView的重新引用机制
* 在tableView上下滑动的时候会自动销毁不在屏幕显示的tableViewCell,并且同时创建新的tableViewCell来加载新的数据,在创建一个新的cell和销毁一个滑出屏幕的cell时,会消耗手机中大量的内存资源,所以苹果公司在6.0发布后引用了一个新的方法,dequeue reusable!方法名称的意思为:可以重新引用的,源文件代码如下:
* - (__kindof UITableViewCell *)dequeueReusableCellWithIdentifier:(NSString *)identifier forIndexPath:(NSIndexPath *)indexPath NS_AVAILABLE_IOS(6_0); // newer dequeue method guarantees a cell is returned and resized properly, assuming identifier is registered
* 在cell被新建的时候,使用次方法系统会自动在“缓存池”中寻找匹配,寻找匹配的两个要求,1.唯一标识ID相同,2.cell类型相同
* 在cell滑出屏幕的时候,cell会被系统自动放入缓存池中,并且绑定唯一标示ID,类型在创建的时候被声明。
* 在工具栏中的唯一标识如下图
* Bug就出现在这个地方:
* unable to dequeue a cell with identifier cell_id - must register a nib or a class for the identifier or connect a prototype cell in a storyboard
* 这句话的意思为系统找缓存池中寻找带有相同唯一标识的ID但是类型不明确,或者没有找到相同类型的xib。
* 由于寻找匹配重新引用“缓存池”中的cell要满足两个条件:唯一标识ID和唯一标识ID对应的类型也要相同,但是苹果提供的次方法只能确定唯一标识,所以要在程序启动的时候viewDidLoad中告诉系统在“缓存池”中寻找cell时候唯一ID对应的类型。
* 解决bug的方法:
* 给tableView注册一个cell,并且告诉系统cell的类型样式
* 在viewDidLoad中声明的代码如下:
* [self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:ID];
* 2.第二个小问题
* 使用tableView的cell重用机制后cell中不显示detailTextLabel。
* 如果用UITableViewCell的类创建一个cell,系统默认的cell的样式为UITableViewCellStyleDefault,这种样式不会显示detaiTextLabel,所以要重新构建一个类,重写init方法设置cell的格式为UITableViewCellStyleSubtitle
* 用自己写的一个类创建的cell的样式为UITableViewCellStyleSubtitle,可以显示detaiTextLabel
* [self.tableView registerClass:[ERTableViewCell class] forCellReuseIdentifier:ID];
* 如果用到了其他样式的cell,可以自定义一个继承于UITableViewCell的类,并且重写init的方法,使其初始化的时候改变系统的默认样式
* 苹果提供了cell的四种类型:UITableViewCellStyleDefault(系统默认样式)、UITableViewCellStyleValue1、UITableViewCellStyleValue2、UITableViewCellStyleSubtitle
* 源文件如下
* UITableViewCellStyleDefault, // Simple cell with text label and optional image view (behavior of UITableViewCell in iPhoneOS 2.x)
UITableViewCellStyleValue1, // Left aligned label on left and right aligned label on right with blue text (Used in Settings)
UITableViewCellStyleValue2, // Right aligned label on left with blue text and left aligned label on right (Used in Phone/Contacts)
UITableViewCellStyleSubtitle // Left aligned label on top and left aligned label on bottom with gray text (Used in iPod).
* 小小案例还有两个值得注意的点:
* 1.
//用static修饰ID是让ID一直保存在静态区域,当不引用的时候ID也不会被销毁,保证了唯一标识ID在程序运行时候的ID的地址和值的稳定性
//而@"cell_id"是保存在堆区的
static NSString * ID = @"cell_id";
2.
//用__weak修饰weakAlertCountroller是为了在下文中经过block引用后copy变成强引用,避免循环引用,在开发中block引用外部的对象时通常创建一个被__weak修饰的临时对象,在block中调用临时对象
__weak typeof(alertCountroller) weakAlertCountroller = alertCountroller;
源代码传送门:http://pan.baidu.com/s/1gexiydl
*/