在indexPath处的静态UITableViewCell中复制单元格

时间:2015-02-25 21:06:39

标签: ios objective-c uitableview

我有静态UITableViewCell。在故事板中,当您选择一个部分并添加另一个单元格(在属性检查器中)时,它会复制该部分中的最后一行,并将其添加到tableView。有没有办法以编程方式做到这一点?

基本上我想要做的是复制一个indexPath的单元格(包含所有它的子视图),然后将其粘贴到该单元格下面。

2 个答案:

答案 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;
    }
  ...
}

话虽如此,我不太确定你是否真的应该这样做,因为你可以使用与原始单元格相同的方法创建完全相同的单元格:)