検索

ホームページ  >  に質問  >  本文

ios - 关于cell重用的一些很纠结的问题(来大神解释下)


static NSString *orderCellID = @"MyOrderCell";

[self.mTableView registerClass:[MyOrderCell class] forCellReuseIdentifier:orderCellID];
1.MyOrderCell *cell = (MyOrderCell *)[tableView dequeueReusableCellWithIdentifier:orderCellID];

    if (cell == nil) {

       cell = [[MyOrderCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:orderCellID];

    }
2.MyOrderCell *cell = [self.mTableView dequeueReusableCellWithIdentifier:orderCellID forIndexPath:indexPath];

这两种重用cell的方法问题就是...

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {

    UITableViewCell *cell = [self tableView:tableView cellForRowAtIndexPath:indexPath];
    
    NSLog(@"cell height %f",cell.frame.size.height);
    
    return cell.frame.size.height;
}

如果用方法2.的话为什么
UITableViewCell *cell = [self tableView:tableView cellForRowAtIndexPath:indexPath];
就报错了?????

但是用方法1的话确实是可行的...可以来个大神详细解释下吗

大家讲道理大家讲道理2771日前610

全員に返信(5)返信します

  • 怪我咯

    怪我咯2017-04-17 16:56:14

    あなたの 2 つのメソッドは実際には同じです、つまり

    リーリー

    このメソッドは、再利用を待機している生成されたセルがあるかどうかに関係なく、セルを返すことが保証されています (セルがある場合は取得され、ない場合は新しいセルが生成されます)。ただし、このメソッドを呼び出すには条件があります。つまり、登録するには registerClass または registerNib メソッドを呼び出している必要があります。これはこのドキュメントに記載されています。
    もう一つの方法は、既に生成された再利用待ちのセルがあるかどうかを判断し、セルがあればそれを返し、ない場合はnilを返すというものです。 。

    リーリー

    このメソッドは手動で呼び出すことはできません。このメソッドによって返されるセルはインターフェイスに表示され、再利用されます。このメソッドを手動で呼び出すと、返されるセルは役に立たなくなり、高さを計算した後に解放されます。 。コード内の計算が多い場合、メソッドが呼び出されるたびにセルが生成されます。

    つまり、あなたが苦労している再利用の問題は、実際には tableView:cellForRowAtIndexPath: 関数を手動で呼び出したことが原因です。

    返事
    0
  • ringa_lee

    ringa_lee2017-04-17 16:56:14

    1 たとえそれが可能であっても、戻り値は nil である必要があります

    返事
    0
  • 天蓬老师

    天蓬老师2017-04-17 16:56:14

    リーリー

    このコードは通常、このように書くことはできません。高さを返すには、このようにセルを取得してから高さを返すことはできません。このプロキシ メソッドが呼び出されるとき、- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath はまだ実行されていないことを理解しておく必要があります。この 2 つの呼び出し順序を理解する必要があります。
    Tableview は事前に高さを取得する必要があり、セルを再利用してセルを返します。セルは以前の高さに応じてレイアウトされます。

    したがって、高さを返すプロキシ メソッドには一般に 2 つのアイデアがあります:

    1. セル内のさまざまな UI 要素の高さと間隔を取得し、累積計算を実行します。以下の参照リンクを参照してください。

    2. 自動レイアウト制約が使用されている場合は、`[cell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize] を使用して高さを計算します。これに関しては、
      オープン ソース プロジェクト https://github.com/ を参照してください。 forkingdog/UITableView-FDTemplateLayoutCell

    こちらをご覧ください: UITableViewCell の高さの動的計算の詳細な説明

    返事
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-17 16:56:14

    上の人が正しいです。システムのプロキシ メソッドを自分で積極的に呼び出さないことをお勧めします。そうしないと、完全に保証されていない場合に問題が発生する可能性があります。
    さらに、投稿者の質問は 2. MyOrderCell *cell = [self.mTableView dequeueReusableCellWithIdentifier:orderCellID forIndexPath:indexPath]; このように書くとなぜうまくいかないのですか?

    公式ドキュメントでは、dequeueReusableCellWithIdentifier:: について説明しています。
    識別子によって特定された再利用可能なテーブルビュー セル オブジェクトを返します。
    再利用するセル オブジェクトを識別する文字列 このパラメータは nil であってはなりません。 .

    関連付けられた識別子を持つ UITableViewCell オブジェクトを返します、または再利用可能セル キューにそのようなオブジェクトが存在しない場合は nil を返します

    再利用可能なセルが必要な場合は、最初にセルを作成する必要があることがわかりましたか?まだ作成していない場合、システムは作成しません。最初の方法は正しいです。システムが再利用可能なセルがないことを検出すると nil を返し、このセルは次回システムによってキューに追加されるためです。システムは再利用すると何かを与えてくれます
    参考のために見つけました: リンクの説明

    返事
    0
  • 大家讲道理

    大家讲道理2017-04-17 16:56:14

    2 番目の方法では、最初に tableView にセルを登録する必要があります

    返事
    0
  • キャンセル返事