2

私は、ロードされたペン先の UITableViewCell を返す tableView viewForHeaderInSection を実装しています。

この質問の目的のために単純化しました。

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
    UIView* header = [CellFactoryController newSectionHeader];
    header.text = "Some Text Depending on the section"
    return header;

}

残念ながら、これらのヘッダーが表示されていなくても、50 以上のヘッダーがテーブルの描画時に nib から一度に読み込まれることがあるため、これは非常に遅くなります。

この例でUIViewを複製してヘッダーを複製できる現実的な方法はありますか? または、ヘッダー UIView をハードコードして作成する唯一の方法はありますか?

ありがとう

4

3 に答える 3

1

ええと、この質問への回答がまだ必要かどうかはわかりませんが、一体何なのですか。これをやろう。いくつかの仮定を立てますが、パフォーマンスの問題がある場合、これを実際に解決する唯一の方法はそれをテストすることであり、ビューの複雑さについての知識がなければ、信頼できる指標を実際に取得することはできません. . だから私はあなたがいくつかのことを試したと仮定し、あなたがおそらく試していない何かをそこに捨てます.

nib からビューをロードすると、ファイルからアーカイブ解除されます。その読み込みが 50 回発生すると、パフォーマンスの問題に大きく影響する可能性があります。では、他に何ができるでしょうか?さて、テーブル ビュー コントローラー クラスで、 type の新しいインスタンス変数を作成しますNSData。次に、-initメソッド (または指定されたその他の初期化子) で、プロパティ リストからビューを読み込みます。

- (id)init
{
    self = [super init];

    if (self) {
        // Other initialization code.

        NSString *filePath = [[NSBundle mainBundle] pathForResource:@"MyView"
                                                             ofType:@"plist"];
        myData = [[NSData alloc] initWithContentsOfFile:filePath];
    }

    return self;
}

これで、このプロパティ リストが にロードされましたNSData。さて、残りは明らかです:

- (UIView *)tableView:(UITableView *)tableView
viewForHeaderInSection:(NSInteger)section 
{
    UIView *view = [NSKeyedUnarchiver unarchiveObjectWithData:myData];

    return view;
}

ここでの私の目標は、完全にインスタンス化されたビューを常にメモリに保持することでした。しかし、「彼はどのようにしてその plist を作成するのだろうか?」と考えました。なのでちょっと改造しました。ファイルからデータをロードする代わりに、コードでビューを作成します。

- (UIView *)tableView:(UITableView *)tableView
viewForHeaderInSection:(NSInteger)section 
{
    UIView *headerView;

    if (myData == nil) {
        headerView = [[UIView alloc] init];
        // Configure your view, but only that part that isn’t customized.

        myData = [[NSKeyedArchiver archivedDataWithRootObject:headerView] copy];
    } else {
        headerView = [NSKeyedArchiver unarchiveObjectWithData:myData];
    }

    // Now customize the view for your particular section.

    return headerView;
}

これにより、コードでビューを作成する柔軟性が得られるはずですが、うまくいけば、ビューをメモリに保持してキャッシュすることもできます。やってみて!

于 2011-02-01T02:32:54.723 に答える
1

先日、 UINib クラスの doco を読んでいて、 nibsの内部構造をキャッシュして、繰り返されるリクエストをより高速に実行する方法について話していました。それはあなたにとって適切な選択肢かもしれません。

于 2011-02-01T02:28:48.057 に答える
0

ビューを個別の .xib ファイルに分割して読み込みを高速化することもできますが、(あなたが言ったように) 最善の策は、おそらくそれらのビューを手続き的に作成することです。急ごしらえのサンプル コード以外では、.xib ファイルは通常、アプリ全体または全画面表示に必要なコンテナーの非常に高レベルのレイアウト用に予約されています。テーブル ビューのセル、ヘッダー、フッターなどのレイアウトおよび図面の詳細指向の要素は、通常、手続き的に処理する方が適切です。

于 2011-02-01T02:22:20.653 に答える