直接用tableview的datasource的numberOfSectionsInTableView和numberOfRowsInSection就可以取到最后一个cell的indexPath,再跟目标cell的indexPath一比就行了。点击一个cell 高度增加,tableview初始化是4个cell的大小,当点击第四个cell的时候 高度增加了,cell里增加的部分在tableview的下面,看不到了,需要向上拖动tableview才行,这样用户体验不好。现在的情况是,点击一个cell时,增加了高度,当点击的下一个cell在上次点击的cell的下面,高度增加的时候是向上的方向上增加的,如果在上次点击的cell上面就向下的方向增加,能不能自动判断当前cell在tableview中的位置,根据当前位置决定增加高度的方向。
一般的话- (UITableViewCell )tableView:(UITableView )tableView cellForRowAtIndexPath:(NSIndexPath )indexPath 这个方法里应该都会设置cell内的显示内容,在didselect里面你把上面那个方法里的[xxxx objectAtIndex:indexPathrow] xxxxx]再次赋给你自己要取指的对象不就可以了么
UITableView最核心的思想就是UITableViewCell的重用机制。简单的理解就是:UITableView只会创建一屏幕(或一屏幕多一点)的UITableViewCell,其他都是从中取出来重用的。每当Cell滑出屏幕时,就会放入到一个集合(或数组)中(这里就相当于一个重用池),当要显示某一位置的Cell时,会先去集合(或数组)中取,如果有,就直接拿来显示;如果没有,才会创建。这样做的好处可想而知,极大的减少了内存的开销。
知道UITableViewCell的重用原理后,我们来看看UITableView的回调方法。UITableView最主要的两个回调方法是tableView:cellForRowAtIndexPath和tableView:heightForRowAtIndexPath。理想上我们是会认为UITableView会先调用前者,再调用后者,因为这和我们创建控件的思路是一样的,先创建它,再设置它的布局。但实际上却并非如此,我们都知道,UITableView是继承自UIScrollView的,需要先确定它的contentSize及每个Cell的位置,然后才会把重用的Cell放置到对应的位置。所以事实上,UITableView的回调顺序是先多次调用tableView:heightForRowAtIndexPath:以确定contentSize及Cell的位置,然后才会调用tableView:cellForRowAtIndexPath:,从而来显示在当前屏幕的Cell。
举个例子来说:如果现在要显示100个Cell,当前屏幕显示5个。那么刷新(reload)UITableView时,UITableView会先调用100次tableView:heightForRowAtIndexPath:方法,然后调用5次tableView:cellForRowAtIndexPath:方法;滚动屏幕时,每当Cell滚入屏幕,都会调用一次tableView:heightForRowAtIndexPath:、tableView:cellForRowAtIndexPath:方法。
看到这里,想必大伙也都能隐约察觉到,UITableView优化的首要任务是要优化上面两个回调方法。事实也确实如此,下面按照我探讨进阶的过程,来研究如何优化:
1、提前计算并缓存好高度(布局),因为heightForRowAtIndexPath:是调用最频繁的方法;
2、异步绘制,遇到复杂界面,遇到性能瓶颈时,可能就是突破口;
3、滑动时按需加载,这个在大量展示,网络加载的时候很管用!(SDWebImage已经实现异步加载,配合这条性能杠杠的)。
1、正确使用reuseIdentifier来重用Cells
2、尽量使所有的view opaque,包括Cell自身
3、尽量少用或不用透明图层
4、如果Cell内现实的内容来自web,使用异步加载,缓存请求结果
5、减少subviews的数量
6、在heightForRowAtIndexPath:中尽量不使用cellForRowAtIndexPath:,如果你需要用到它,只用一次然后缓存结果
7、尽量少用addView给Cell动态添加View,可以初始化时就添加,然后通过hide来控制是否显示
说明:
本文是从网上摘抄下来的,供本人学习使用
在IOS开发中,很多时候项目需求会有点击某一行,展开cell下面的cell,在此点击会收起;
这种实现方式很多,个人这里随便推荐一种实现方式:
1、在数据转模型的model里面添加一个属性, @property ( assign , nonatomic ) BOOL isOpen; //是否展开
2、在对应的tableView层,- ( nullable UIView)tableView:(UITableView)tableView viewForHeaderInSection:(NSInteger)section;方法下面生成View,并未其添加点击事件;点击事件方法如下:
在对应的tableView的dataSource方法中:
以及- (UITableViewCell)tableView:(UITableView)tableView cellForRowAtIndexPath:(NSIndexPath)indexPath{ if ( self dataList[indexPathsection]isOpen) {
if ( self dataList[indexPathsection]isOpen) {
//设置展开的cell
}else{
//设置没有展开的cell;
}}
实现的方法和tableBView差不多,实现他的几个代理方法:
解释一下:传进来的item:代表他给你的model,根据这个model可以去获取上级model: clickpackagesModelpackageModel = [treeViewparentForItem:model];
同样可以根据model获取相应的cell: clickPackageCellpackagecell01 = (clickPackageCell)[treeViewcellForItem:model];
有了上面两个方法,基本就能玩转三级展开和收起;
对于三级展开,大家还有什么好的想法亦或者好的框架没?欢迎补充
当我们点击某个cell时,会执行下面这个方法,方法中调用另一方法执行具体 *** 作:
- (void)tableView:(UITableView )tableView didSelectRowAtIndexPath:(NSIndexPath )indexPath {
if (0 == indexPathsection) {
[self btnActionForUserSetting:self];
}
}
在下面方法中怎样获取刚刚选中的那个cell,并修改它的内容呢?
- (void)btnActionForUserSetting:(id) sender {
NSIndexPath indexPath = [selftableView indexPathForSelectedRow];
UITableViewCell cell = [selftableView cellForRowAtIndexPath:indexPath];
celltextLabeltext= @"abc";
}
这样,被点击的cell的内容就被修改了。
每个UITableViewCell里有个UITextField,当UITextField获得焦点时不会触发tableview的didSelectRowAtIndexPath方法,就不能知道触发是哪个cell,可以获得UITextField所在行的indexPath,方法很简单,注意两种方式。
根据tag值进行获取,在这里设置tag值,然后在方法-(UITableViewCell )tableView:(UITableView )tableView cellForRowAtIndexPath:(NSIndexPath )indexPath中进行获取这个tag值,获取方法是:UIButton exitBtn = (UIButton )[cell viewWithTag:1];//1是我上面设置的tag值这样就获取到了,你再给他添加action事件就可以了,
以上就是关于如何记录tableView cell当前滚动到的位置全部的内容,包括:如何记录tableView cell当前滚动到的位置、如何获取UITableView所有的cell、UITableView的复用机制以及优化等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)