如何正确初始化自定义UITableviewCell?

时间:2013-12-22 01:05:11

标签: ios objective-c uitableview initialization

我使用以下两种方法返回自定义单元格:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    NSString *key = [self keyForIndexPath:indexPath];
    UITableViewCell *cell;

    if ([key isEqualToString:DoneButtonCellKey]) {
        cell = [self [self doneButtonCellForIndexPath:indexPath];
        return cell;
    } else {
        //code to return default cell...
    }
} 

然后:

- (DoneButtonCell *)doneButtonCellForIndexPath: (NSIndexPath *)indexPath {

    DoneButtonCell *cell = [self.tableView dequeueReusableCellWithIdentifier:DoneButtonCellIdentifier forIndexPath:indexPath];
    return cell;

}

这里使用单元格的正确init方法是什么,所以我可以在初始化时更改单元格的某些属性?

编辑:我发现了问题,因为没有为我调用init / awakeFromNib方法。我追踪了错误,并且我没有将“自定义类”从UITableViewCell更改为我的自定义类。现在,awakeFromNib和initWithCoder的工作方式如下所述。

4 个答案:

答案 0 :(得分:36)

您可以在DoneButtonCell的课程中进行更改,或者在

中进行
- (void)awakeFromNib
{
 .. essential to call super ..
 super.awakeFromNib()
 //Changes done directly here, we have an object
}

initWithCoder:方法:

-(id)initWithCoder:(NSCoder*)aDecoder
{
   self = [super initWithCoder:aDecoder];

   if(self)
   {
     //Changes here after init'ing self
   }

   return self;
}

答案 1 :(得分:5)

如果你正在使用Swift,请记住确保视图在创建时初始化的简单方法是使用didSet方法。例如,要将UIImageView转换为圆形,您可以添加如下代码:

@IBOutlet weak var profileImageView: UIImageView! {
    didSet {
        // Make the profile icon circle.
        profileImageView.layer.cornerRadius = self.profileImageView.frame.size.width / 2
        profileImageView.clipsToBounds = true
    }
}

答案 2 :(得分:3)

这就是我初始化自定义单元格的方法

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *simpleTableIdentifier = @"FileTableViewCell";

    FileTableViewCell *cell = (FileTableViewCell *)[tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];
    if (cell == nil)
    {
        NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"FileTableViewCell" owner:self options:nil];
        cell = [nib objectAtIndex:0];
    }

    // Configure the cell here...
      // Configure the cell.
FileRepresentation* fileRepresentation = _fileList[indexPath.row];
cell.textLabel.text = [self userFilename:[fileRepresentation.fileName stringByDeletingPathExtension]];

cell.detailTextLabel.text = [fileRepresentation modifiedDate];


cell.accessoryView=nil;
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
[cell.progressIndicator setHidden:YES];

cell.imageView.image = [UIImage imageNamed:_fileImageName];

// Disable any user interaction while processing a request
if (_fileIsOpen || _creatingDocument || _deletingDocument) {

    cell.selectionStyle = UITableViewCellSelectionStyleNone;
    cell.textLabel.textColor = [UIColor grayColor];

} else {

    cell.textLabel.textColor = [UIColor blackColor];
    cell.selectionStyle = UITableViewCellSelectionStyleDefault;

}

}

答案 3 :(得分:1)

  1. 首先尝试使用UITableView的dequeueReusableCellWithIdentifier方法将单元格出列。
  2. 如果单元格不可用(nil),请使用[[NSBundle mainBundle] loadNibNamed:@"<#your custom cell nib name#>" owner:nil options:nil][0]对其进行初始化。
  3. 在自定义单元格的.m文件中,为自定义初始化代码实现initWithCoder:初始化程序:

  4. - (id)initWithCoder:(NSCoder *)aDecoder {  
        self = [super initWithCoder:aDecoder];  
        //your custom initialization code  
        return self;  
    }  
    

    这是从具有loadNibNamed的笔尖加载任何视图时调用的指定初始值设定项,如自定义表格视图单元格。