ios - 复制 UITableViewCell

标签 ios objective-c iphone uitableview cocoa-touch

我正在从 nib 文件中读取 tableView:cellForRowAtIndexPath: 中的自定义表格单元格。这对我来说非常有用,只是速度很慢。

现在,我知道从长远来看正确的做法是完全用代码创建单元格,并使用单一 View ,等等。但这是一个原型(prototype),我不想投入那么多精力。

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

这是我用来加载 Nib 的方法,我从 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 不支持任何一种复制协议(protocol)。

如果必须的话,我可以告诉他们忽略速度,直到我准备好完全取下 Nib ,但如果这里有容易实现的目标,我宁愿让它运行得更快一些。

有什么想法吗?

最佳答案

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

UITableViewCell 不符合 NSCopying 协议(protocol),但支持 keyed 归档/解档机制,因此可用于克隆。

基于答案“ How to duplicate a UIButton in Objective C? "我的数据源委托(delegate)方法如下所示:

- (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 是一个从 View 的 nib 文件加载一次的单元格。

我没有测试什么会更快:“archive + unarchive”克隆或“load nib file + unarchive”框架将在 -loadNibNamed:owner:options: 的情况下执行,我使用这种方法只是出于方便的考虑,但很有可能内存操作比文件操作更快。

编辑:它似乎并不像起初看起来那么容易。由于 UIImage 不符合 NSCoding,因此在没有额外代码的情况下无法复制配置了 UIImageViews 的单元格。是的,复制整个图像绝对不是一个好习惯,感谢 Apple 指出这一点。

关于ios - 复制 UITableViewCell,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/571158/

相关文章:

ios - NSError 没有被填充

ios - 将 C++ 类的引用传递给 Objective C 接口(interface)

ios - 如何使封闭的 UIView 与嵌入的 UIDatePicker 大小相同?

ios - 单击多个单元格上的 UItableview 正在快速检查 3

ios - 无法在 iPhone 5S 和 iPad Air 中绘制填充矩形

ios - 在 UITabBar 的每个 UINavigationController 中重新加载所有 UIViewController

ios - iOS 8.1 中的 UITextField 在使用某些字体时在编辑模式和非编辑模式之间具有不同的垂直文本对齐方式

ios - 将控制权返回给我的根 Controller

ios - UIButton 没有添加到 UIView

iPhone:如何在 tabelview 加载后在 tableview 中添加行?