首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >正在复制UITableViewCell

正在复制UITableViewCell
EN

Stack Overflow用户
提问于 2009-02-20 20:43:26
回答 5查看 9.2K关注 0票数 7

我正在从nib文件中读取tableView:cellForRowAtIndexPath:中的自定义表格单元格。这对我的目的来说工作得很好,只是速度很慢。

现在,我知道从长远来看,正确的做法是完全在代码中创建单元格,并使用单个视图,等等。但这只是一个原型,我不想花太多的精力在它上面。

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

下面是我用来加载nib的方法,我从viewDidLoad: (以及之后的retain )调用它

代码语言:javascript
运行
复制
-(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不支持这两种复制协议。

如果有必要,我可以告诉他们忽略速度,直到我准备完全移除笔尖,但如果这里有低垂的果实,我宁愿让速度更快一些。

有什么想法吗?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-02-20 21:11:32

使用表视图中内置的细胞克隆。Apple知道生成大量表格单元格的速度很慢。查看此方法的文档:

代码语言:javascript
运行
复制
- (UITableViewCell *)dequeueReusableCellWithIdentifier:(NSString *)identifier

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

此外,还可以查看Apple提供的表视图相关示例代码,它使用了这种方法,并向您展示了正确的方法。事实上,你的电池是从一个笔尖加载的,这一点一点也不重要。

稍微澄清一下:我认为上面的方法不适合你克隆细胞。相反,它接受滚动出屏幕的单元格对象,并简单地将它们移动到一个新的点。所以它实际上是在重复使用一个细胞。因此,请确保您的自定义表视图可以设置为它在初始化之外所需的所有新值。

票数 6
EN

Stack Overflow用户

发布于 2011-03-17 20:00:18

我认为表格单元的复制可以与出队机制一起使用,这将允许创建一次单元(从nib或以编程方式或从其他nib自动加载它并链接为IB中的出口),然后在需要时克隆或出列它。

UITableViewCell不符合NSCopying协议,但支持键控归档/解压机制,可用于克隆。

根据答案“How to duplicate a UIButton in Objective C?”,我的数据源委托方法如下所示:

代码语言:javascript
运行
复制
- (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文件加载一次的单元格。

我没有测试哪种方法会更快:“存档+解压”来克隆还是“加载nib文件+解压”框架在-loadNibNamed:owner:options的情况下会做:,我使用这种方法只是为了方便考虑,但内存操作与文件操作很可能会更快。

编辑:它看起来并不像一开始看起来那么简单。由于UIImage不符合NSCoding,因此不能在没有额外代码的情况下复制配置了UIImageViews的单元。是的,复制整个图像肯定不是一个好的做法,为苹果指出这一点而干杯。

票数 8
EN

Stack Overflow用户

发布于 2009-12-08 17:06:04

我并不以此解决方案为荣,但它可以与最大数量的IB绑定一起工作:

接口(AlbumTableViewCell是UITableViewCell的子类,其实例在AlbumViewController的XIB文件中定义):

代码语言:javascript
运行
复制
@interface AlbumsViewController : UITableViewController {
    IBOutlet AlbumTableViewCell *tableViewCellTrack;
}

@property (nonatomic, retain) AlbumTableViewCell *tableViewCellTrack;

实现(unarchive / archive复制/克隆表格视图单元格):

代码语言:javascript
运行
复制
@implementation AlbumsViewController

@synthesize tableViewCellTrack;

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    AlbumTableViewCell *cell = (AlbumTableViewCell *)[tableView dequeueReusableCellWithIdentifier: @"AlbumCell"];

    if (cell == nil) {
        AlbumsViewController *albumsViewController = [[[AlbumsViewController alloc] init] autorelease];
        [[NSBundle mainBundle] loadNibNamed: @"AlbumsViewController" owner: albumsViewController options: nil];

        cell = albumsViewController.tableViewCellTrack;
    }

    cell.labelTitle.text = ...;
    cell.labelArtist.text = ...;

    return cell;
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/571158

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档