当前位置:  开发笔记 > IOS > 正文

复制UITableViewCell

如何解决《复制UITableViewCell》经验,为你挑选了2个好方法。

我正在tableView:cellForRowAtIndexPath:从nib文件中读取自定义表格单元格.这对我的目的很有用,除非它很慢.

现在,我知道从长远来看,正确的做法是在代码中完全创建单元格,并使用单个视图,依此类推.但这是一个原型,我不想付出那么多努力.

现在,如果我在UIViewController子类中只读取一次nib ,然后tableView:cellForRowAtIndexPath:复制它,我会很高兴.我的假设是复制比读取笔尖更快.

这是我用来加载笔尖的东西,我从viewDidLoad:(和retain之后)调用

-(id)loadFromNamed:(NSString*)name {
    NSArray *objectsInNib = [[NSBundle mainBundle] loadNibNamed:name
                                                          owner:self
                                                        options:nil];
    assert( objectsInNib.count == 1 );
    return [objectsInNib objectAtIndex:0];
}

到目前为止一切都很好.但问题是:我如何反复复制?它甚至可能吗?

我试过[_cachedObject copy][_cachedObject mutableCopy],但UITableViewCell不支持任何一份协议.

如果必须的话,我可以告诉他们忽略速度,直到我准备完全取下笔尖,但如果这里有一个低悬的水果,我宁愿让它快一点.

有任何想法吗?



1> zubko..:

我认为表格单元的复制可以与出列机制一起使用,这将允许创建单元格一次(从笔尖或编程或从其他笔尖自动加载并在IB中作为插座链接),然后克隆或出列需要的时候.

UITableViewCell不符合NSCopying协议,但它支持密钥存档/解压缩机制,因此可用于克隆.

基于答案" 如何在Objective C中复制UIButton? "我的数据源委托方法如下所示:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellID = @"CellIdentifier";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellID];

    if (!cell) {
        NSData *archivedData = [NSKeyedArchiver archivedDataWithRootObject:self.tableViewCell];
        cell = [NSKeyedUnarchiver unarchiveObjectWithData:archivedData];
    }

    // ... config ...

    return cell;
}

在我的例子中,self.tableViewCell是从视图的nib文件中加载一次的单元格.

我没有测试什么会更快:"archive + unarchive"克隆或"加载nib文件+ unarchive"哪个框架将在-loadNibNamed的情况下执行:owner:options : ,我只使用这种方法考虑方便,但是内存操作与文件操作的速度很快.

编辑:它看起来并不像最初看起来那么容易.由于UIImage不符合NSCoding,因此无法在没有其他代码的情况下复制具有已配置的UIImageViews的单元格.是的,复制整个图像绝对不是一个好习惯,为Apple指出这一点欢呼.



2> Alex Wayne..:

使用表视图中内置的单元格克隆.Apple知道生成很多表格单元格很慢.查看此方法的文档:

- (UITableViewCell *)dequeueReusableCellWithIdentifier:(NSString *)identifier

您创建一次单元格,然后在请求新单元格时,使用该方法克隆现有单元格.然后,您只需更改有关新单元格的更改内容并返回单元格对象.

另请查看Apple提供的表格视图实际示例代码,该代码使用此方法并以正确的方式显示.你的细胞从笔尖装入的事实根本不重要.


轻微澄清:我不认为上面的方法为您克隆细胞.相反,它需要滚动屏幕的单元格对象,只需将它们移动到新的位置即可.所以它真的重复使用一个细胞.因此,请确保您的自定义表视图可以设置为初始化之外所需的所有新值.


这实际上不是这个问题的正确答案.在初始设置时,每个可见单元的返回将返回nil.所以在`if(cell == nil)`块中你可能想要创建一个新的UITableViewCell,可能是从nib加载.我还希望从控制器中的IBOutlet复制UITableViewCell,我已将其连接到nib中设计的UITableViewCell.但复制失败,说它不支持copyWithZone.
有没有办法在Interface Builder中创建`UITableViewCell`的原型实例,只需克隆`UITableView`所需的数量?它比通过代码设置单元格容易得多.谢谢.
推荐阅读
罗文彬2502852027
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有