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;
}

私は今、このデキューがどのように機能するか混乱しています..にクラスを登録した場合、セルviewDidLoadinitWithStyleメソッドは、再利用するセルがない場合にのみ呼び出されます. 再利用するセルがあれば、それを使用します。他のコード スニペットで多くの 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

理解を深めるために、deque リファレンスとして以下の画像を参照してください。

Deque は、両端からセルを追加および削除できることを意味します。

端とは、上と下を意味します。

Acell、Bcell、Ccell、Dcell を含む 4 つのセルがあり、行の高さが 3 つのセルであるとします。

一度に 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 メソッドを呼び出します。

ストーリーボードを導入する前に、テーブルビューは返されたセルをチェックしますが、これは nil になる可能性があります。したがって、nil の場合は、セルを再割り当てし、データソース メソッドでセルを初期化して提供する必要があります。

于 2013-06-07T08:55:43.120 に答える