0

我想更改UITableView单元格的字体大小和颜色等。我已经设计了定制的单元格,Xcode并且一切正常。

首先,我将在这里发布我的代码 UITableViewController::

- (void)viewDidLoad
{
    [super viewDidLoad];

    [self.tableView registerClass:MainCategoryTableViewCell.class forCellReuseIdentifier:@"MainCategoryCell"];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"MainCategoryCell";
    MainCategoryTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
    return cell;
}

我的自定义单元格:

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        self.title.font = [Theme tableCellTitleFont];
        self.title.textColor = [Theme tableCellTitleColor];

        self.subcategories.font = [Theme tableCellSubTitleFont];
        self.subcategories.textColor = [Theme tableCellSubTitleColor];

        self.costs.font = [Theme tableCellValueFont];
        self.costs.textColor = [Theme tableCellValueColor];
    }
    return self;
}

我现在很困惑这个出队是如何工作的:据我所知,如果我在 中注册类,则viewDidLoad只有initWithStyle在没有单元格可供重用时才调用单元格的方法。如果有一个单元格可重复使用,它将被使用。我在其他代码片段中看到了很多 if(cell == nil) 调用,但这真的有必要吗?我认为该registerClass方法无论如何都可以解决这个问题?

目前我的单元格将完全显示为空。在我注册课程之前,一切正常,但是initWithStyle没有被调用..

完成cellForRowAtIndexPathMethod

#pragma mark Delegate methods
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"MainCategoryCell";
    MainCategoryTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

    // Configure the cell...
    MainCategory *mainCategory = [self.fetchedResultsController objectAtIndexPath:indexPath];
    cell.title.text = mainCategory.name;
    cell.subcategories.text = [NSString stringWithFormat:@"%i subcategories", [[mainCategory getNumberOfSpendingCategories] integerValue]];
    cell.costs.text = [[mainCategory getMonthlyCostsOfAllSpendingCategories] getLocalizedCurrencyString];
    if(!mainCategory.icon){
        cell.icon.image = [UIImage imageNamed:@"DefaultIcon.png"];
    } else {
        cell.icon.image = [UIImage imageNamed:mainCategory.icon];
    }

    if(!mainCategory.color){
        cell.backgroundColor = [PresetColor colorForPresetColor:PresetColorsWhite];
    } else {
        cell.backgroundColor = [PresetColor colorForPresetColor:(PresetColors)[mainCategory.color intValue]];
    }

    cell.cellBackground.image = [[UIImage imageNamed:@"content-bkg"] resizableImageWithCapInsets:UIEdgeInsetsMake(10, 10, 10, 10)];

    return cell;
}
4

3 回答 3

3

如果您已将单元格定义为 xib/storyboard 文件中表格视图的“原型单元格”,那么您根本不必注册它。如果自定义单元格位于单独的 nib 文件中,则使用 注册自定义单元格registerNib,而不是registerClass. 例如:

[self.tableView registerNib:[UINib nibWithNibName:@"MainCategoryTableViewCell" bundle:nil]
      forCellReuseIdentifier:@"MainCategoryCell"];

对于从 nib 文件实例化的单元格,initWithCoder调用的是,而不是initWithStyle.

要配置自定义单元的任何出口,请覆盖awakeFromNib. 连接尚未在 中建立initWithCoder

于 2013-06-07T09:25:58.297 回答
1

为了更好地理解,请参见下图仅作为双端队列参考。

双端队列意味着您可以从两端添加和删除单元格。

我的意思是上下。

假设您有 4 个包含 Acell、Bcell、Ccell 和 Dcell 的单元格,并且行的高度是三个单元格。

所以一次只能看到 3 个单元格。

当您滚动查看 Dcell 时,Acell 将变为不可见行,并且它的内存将被 Dcell 重用。

同样,当您滚动查看 Acell 时,Dcell 将变为不可见行,并且它的内存将被 Acell 重用。

帮助

于 2013-09-08T05:45:07.190 回答
0

它在文档中明确说明

dequeueReusableCellWithIdentifier:forIndexPath:

出于性能原因,表格视图的数据源在将单元格分配给其 tableView:cellForRowAtIndexPath: 方法中的行时,通常应该重用 UITableViewCell 对象。表视图维护数据源已标记为可重用的 UITableViewCell 对象的队列或列表。当被要求为表格视图提供新单元格时,从您的数据源对象调用此方法。如果一个可用的单元格可用,此方法会使现有单元格出列,或者根据您之前注册的类或 nib 文件创建一个新单元格。

.

dequeueReusableCellWithIdentifier:

返回值:具有关联标识符的 UITableViewCell 对象,如果可重用单元队列中不存在此类对象,则返回 nil。

讨论:出于性能原因,表格视图的数据源在将单元格分配给其 tableView:cellForRowAtIndexPath: 方法中的行时,通常应该重用 UITableViewCell 对象。表视图维护数据源已标记为可重用的 UITableViewCell 对象的队列或列表。当被要求为表格视图提供新单元格时,从您的数据源对象调用此方法。如果一个可用的单元格可用,则此方法使现有单元格出列,或者使用您之前注册的类或 nib 文件创建一个新单元格。如果没有单元格可重用并且您没有注册类或 nib 文件,则此方法返回 nil。

如果您为指定的标识符注册了一个类并且必须创建一个新单元格,则此方法通过调用其 initWithStyle:reuseIdentifier: 方法来初始化该单元格。对于基于 nib 的单元格,此方法从提供的 nib 文件加载单元格对象。如果现有单元格可供重用,则此方法将改为调用该单元格的 prepareForReuse 方法。

在介绍故事板之前。tableview 检查返回的单元格可以是 nil 。所以如果 nil 我们必须重新分配单元格并初始化并在数据源方法中提供单元格

于 2013-06-07T08:55:43.120 回答