1

画像編集ツールを書いています。UITableviewドキュメント フォルダの内容を表示している があります。これはすべて期待どおりに機能しています。私が抱えている問題は、新しいファイルを追加するとき、またはドキュメント フォルダーからファイルを削除するときです。

refreshFilesリロード データを呼び出す前に呼び出すファイルを作成または削除する場合、チェックを使用するif(cell == nil) と、ファイル配列の長さの増減に基づいてセルが作成または削除されます。

最後UITableViewCellは、配列の最後の場所にあるファイル名をそのフィールドの名前として取得します。ただし、新しいファイル名は配列内の任意の場所にある可能性があります。正しい内容が表示されるようにするために、if(cell==nil)チェックを外しました。これにより、呼び出されるたびにすべてのセルが再描画されます。

-(void)refreshFiles {

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *pathList = [paths objectAtIndex:0];
NSArray *fileListing = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:pathList error:nil];
NSPredicate *filter = [NSPredicate predicateWithFormat:@"self ENDSWITH '.png'"];
self.fileList = [fileListing filteredArrayUsingPredicate:filter];
[self.fileview reloadData]

}

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

UITableViewCel *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

  // if (cell == nil) { 
    cell = [[[CustomCell alloc] initWithStyle:UITableViewCellStyleDefault    reuseIdentifier:CellIdentifier]autorelease];

objectAtIndex:indexPath.row],self.fileList.count,indexPath.row);
    cell.textLabel.text = [self.fileList objectAtIndex:indexPath.row];

  //   }

return cell;
}

しかし、これは有効な作業方法ですか?将来的にパフォーマンスの問題が発生する可能性はありますか?

4

4 に答える 4

2

UITableViewCellしたがって、キューに入れられた可能性のある UITableViewCell を再利用するのではなく、常に新しいものを作成しています。

チェックcell == nilは、再利用の準備ができているセルがすでに存在するかどうかを確認するためにあります。そうでない場合はnil、再作成する必要があります。

私が今言ったように、あなたは Apple が のために作成したスマートキューイングメカニズムを使用していませんUITableView。パフォーマンスのためにそこにあるので、私があなただったら、まだその小切手を持っているでしょう.

于 2012-09-11T12:01:22.560 に答える
1

元のコードには単純なエラーがあります。セルが再利用されるときではなく、新しいセルが割り当てられた場合にのみセル テキストを設定します。正しい順序は次のとおりです。

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) { 
    cell = [[[CustomCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
}
cell.textLabel.text = [self.fileList objectAtIndex:indexPath.row];
于 2012-09-11T12:58:17.793 に答える
0

cell==nilピーターの答えが示唆しているように、論理の場合、目的について混乱するかもしれないと思います。あなたはそれをそこに保ちたいのです。からアイテムを削除した場合、あなたが戻ってきたself.fileListと仮定すると、それがあなたがする必要があるすべてであり、あなたがやったら。iOSは、現在削除されている古い行をすべて削除します。ただし、を削除することで、iOSに古いセルを再利用させないため、メモリを浪費することになります。そのロジックを取り除く正当な理由がない限り、そうすべきではありません。tableView:numberOfRowsInSection:[self.fileList count]reloadDatacell==nilcell==nil

ただし、コードスニペットにはステートメントの奇妙な断片が含まれています。

    objectAtIndex:indexPath.row],self.fileList.count,indexPath.row);

その行が何であるかわからないので、コードサンプルを明確にすることをお勧めします。

結論として、ソリューションは非効率的であり、コードに関する他の問題を覆い隠している可能性があります。たとえば、投稿を簡素化するために、の重要な部分をいくつか削除したかどうか疑問に思いますcellAtRowForIndexPath。特に、UILabel実際にコントロールなどを作成していますcellAtRowForIndexPathか?おそらく、あなたは私たちと完全な方法を共有することができます。の後に望ましくない結果が表示されたreloadData場合、それは多くの場合、ユーザーがでいくつかのコントロールを作成したcellAtRowForIndexPathが、デキューされたセルを再利用するときにこの事実を説明できなかったことが原因です。一般的な解決策は、サブビューをに追加する場合UITableViewCellはそれらにプロパティを割り当てtag、デキューされたセルを再利用する場合は、を使用して作成されたサブビューを取得することですviewWithTag。の使用を参照してくださいtagテーブルビュープログラミングガイドのカスタムセルの説明のプロパティ。

cell == nilこれは問題ではないかもしれませんが、それにもかかわらず、条件付きロジックをコメントアウトしたときにコードの動作が異なるという事実は、cellForRowAtIndexPathメソッドの詳細に問題があることを意味します。単純化された例(コードの断片的な行を除いて)には明らかに問題がないため、おそらく完全なメソッドを私たちと共有することができます。

于 2012-09-11T12:39:10.530 に答える
0

これは絶対に安全ですdequeueReusableCellWithIdentifier。呼び出しを省略して、識別子を再利用せずにセルを作成できます。

もちろん、セルの再利用がないことを意味しますが、セルがメモリを大量に使用していないが、UI プレゼンテーション ロジックを大量に使用している場合は、これが便利なアプローチであることがわかりました。そのような場合、私はセルのキャッシングを担当し、reuseIdentifier ロジックと競合する手動で行うことができます。

この状況に対する私のアプローチは、少なくともタイトル ID、名前、セクション ヘッダー ビュー、および少なくともセル ビューと関連するセル情報を格納する Row オブジェクトの配列を格納する抽象セクション クラスを作成することです。

おまけとして、非常に簡単なセクション管理があります。たとえば、折りたたんだり元に戻したりするようなスムーズなセクション アニメーションを実装できます。

ただし、最も単純なテーブルの場合、実装がはるかに高速であるため、常に reuseIdentifier アプローチに従います。

于 2012-09-11T12:32:39.760 に答える