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的话确实是可行的...可以来个大神详细解释下吗
怪我咯2017-04-17 16:56:14
あなたの 2 つのメソッドは実際には同じです、つまり
リーリーこのメソッドは、再利用を待機している生成されたセルがあるかどうかに関係なく、セルを返すことが保証されています (セルがある場合は取得され、ない場合は新しいセルが生成されます)。ただし、このメソッドを呼び出すには条件があります。つまり、登録するには registerClass または registerNib メソッドを呼び出している必要があります。これはこのドキュメントに記載されています。
もう一つの方法は、既に生成された再利用待ちのセルがあるかどうかを判断し、セルがあればそれを返し、ない場合はnilを返すというものです。 。
このメソッドは手動で呼び出すことはできません。このメソッドによって返されるセルはインターフェイスに表示され、再利用されます。このメソッドを手動で呼び出すと、返されるセルは役に立たなくなり、高さを計算した後に解放されます。 。コード内の計算が多い場合、メソッドが呼び出されるたびにセルが生成されます。
つまり、あなたが苦労している再利用の問題は、実際には tableView:cellForRowAtIndexPath: 関数を手動で呼び出したことが原因です。
天蓬老师2017-04-17 16:56:14
リーリー
このコードは通常、このように書くことはできません。高さを返すには、このようにセルを取得してから高さを返すことはできません。このプロキシ メソッドが呼び出されるとき、- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
はまだ実行されていないことを理解しておく必要があります。この 2 つの呼び出し順序を理解する必要があります。
Tableview は事前に高さを取得する必要があり、セルを再利用してセルを返します。セルは以前の高さに応じてレイアウトされます。
したがって、高さを返すプロキシ メソッドには一般に 2 つのアイデアがあります:
セル内のさまざまな UI 要素の高さと間隔を取得し、累積計算を実行します。以下の参照リンクを参照してください。
自動レイアウト制約が使用されている場合は、`[cell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize] を使用して高さを計算します。これに関しては、
オープン ソース プロジェクト https://github.com/ を参照してください。 forkingdog/UITableView-FDTemplateLayoutCell
こちらをご覧ください: UITableViewCell の高さの動的計算の詳細な説明
伊谢尔伦2017-04-17 16:56:14
上の人が正しいです。システムのプロキシ メソッドを自分で積極的に呼び出さないことをお勧めします。そうしないと、完全に保証されていない場合に問題が発生する可能性があります。
さらに、投稿者の質問は 2. MyOrderCell *cell = [self.mTableView dequeueReusableCellWithIdentifier:orderCellID forIndexPath:indexPath]; このように書くとなぜうまくいかないのですか?
公式ドキュメントでは、dequeueReusableCellWithIdentifier:: について説明しています。
識別子によって特定された再利用可能なテーブルビュー セル オブジェクトを返します。
再利用するセル オブジェクトを識別する文字列 このパラメータは nil であってはなりません。 .
関連付けられた識別子を持つ UITableViewCell オブジェクトを返します、または再利用可能セル キューにそのようなオブジェクトが存在しない場合は nil を返します。
再利用可能なセルが必要な場合は、最初にセルを作成する必要があることがわかりましたか?まだ作成していない場合、システムは作成しません。最初の方法は正しいです。システムが再利用可能なセルがないことを検出すると nil を返し、このセルは次回システムによってキューに追加されるためです。システムは再利用すると何かを与えてくれます
参考のために見つけました: リンクの説明