我有静态UITableViewCell
。在故事板中,当您选择一个部分并添加另一个单元格(在属性检查器中)时,它会复制该部分中的最后一行,并将其添加到tableView
。有没有办法以编程方式做到这一点?
基本上我想要做的是复制一个indexPath
的单元格(包含所有它的子视图),然后将其粘贴到该单元格下面。
答案 0 :(得分:0)
不,你不能复制一个单元格。 UITableViewCell,而不是它的任何超类都不符合NSCopying。如果需要动态添加更多单元格(在代码中),最好使用动态原型。通过向用于填充表的数组添加另一个元素来添加新单元格,并调用reloadData。
答案 1 :(得分:0)
我会说是的。如果您查看UITableViewCell的标头,它会实现 NSCoding 。因此,在 UITableViewCell 的自定义子类中,实现 NSCoding 协议类并对其中的自定义属性进行编码/解码。确保在 initWithCoder :方法中设置单元格的所有属性,使其看起来类似于您拥有的单元格。然后,当您重新加载表或插入tableView单元格时,只需归档和取消归档您要使用的单元格,即可创建它的副本。你有相同的细胞。
@interface MyCustomClass: UITableViewCell
@property (nonatomic, strong) UIColor *myBackground;
@property (nonatomic, copy) NSString *text;
@end
@implementation MyCustomClass
- (id)initWithCoder:(NSCoder *)aDecoder
{
if (self = [super initWithCoder:aDecoder]) {
self.myBackground = [aDecoder decodeObjectForKey:@"myBackground"];
self.text = [aDecoder decodeObjectForKey:@"myTitle"];
self.contentView.backgroundColor = self.myBackground;
self.titleLabel.text = self.text;
}
return self;
}
- (void)encodeWithCoder:(NSCoder *)aCoder
{
[super encodeWithCoder:aCoder];
[aCoder encodeObject:self.myBackground forKey:@"myBackground"];
[aCoder encodeObject:self.text forKey:@"myTitle"];
}
@end
然后,在tableView数据源 cellForRowAtIndexPath 方法中的某些位置,只需复制所需的单元格并将其返回,
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
...
...
if (self.shouldCopyCell) {
UITableViewCell *cellToCopy = [self.tableView cellForRowAtIndexPath:indexPathToCopyCellFrom];
NSData *copiedData = [NSKeyedArchiver archivedDataWithRootObject:cellToCopy];
UITableViewCell *newCell = [NSKeyedUnarchiver unarchiveObjectWithData:copiedData];
return newCell;
}
...
}
话虽如此,我不太确定你是否真的应该这样做,因为你可以使用与原始单元格相同的方法创建完全相同的单元格:)