2009-03-21 7 views
2

私はnibが読み込まれたUITableViewCellを返すtableView viewForHeaderInSectionを実装しています。どのようにNIBは、パフォーマンスをヒットせずに、tableView viewForHeaderInSectionでUIViewをロードすることができます

私はこの質問のために簡略化しました。

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

} 

私は時々50+の表は、これらのヘッダは、ビューが表示されていないにもかかわらず、描画時に全てが一斉にペン先からロードされますヘッダを持っているので、残念ながら、これは非常に遅いです。

この例では、UIViewをクローンしてヘッダーを複製できる現実的な方法はありますか?または、私はちょうどヘッダーを作成するための唯一の方法ですUIViewハードコーディングされた? (あなたが言ったように)

おかげ

答えて

0

あなたは、潜在的に、読み込みを高速化する別の.xibファイルにあなたの意見を破ることができますが、あなたの最善の策は、おそらく手続きこれらのビューを作成することになるだろう。 Quickieサンプルコードの外では、.xibファイルは一般に、アプリケーション全体またはフルスクリーン表示に必要なコンテナの非常に高いレベルのレイアウト用に予約されています。表ビューのセル、ヘッダー、フッターなどのレイアウトと描画のディテール指向の要素は、一般的には手続き的に処理する方が優れています。

1

もう一晩はUINib classのドコモを読んでいましたが、それはニブの内部構造をどのようにキャッシュしているのかということで繰り返し要求が高速に実行されていました。それはあなたのための適切なオプションかもしれません。

1

あなたはまだこの質問への回答が必要かどうかはわかりませんが、どうしたらいいでしょうか。これをやろう。私はいくつかの前提を立てるつもりですが、パフォーマンス上の問題を抱えている場合は、実際にこれを解決する唯一の方法は、テストすることです。ビューの複雑さを理解していなければ、 。だから私はあなたがいくつかのことを試して、あなたが試していないかもしれない何かをそこに投げたと仮定しよう。

ペン先からビューを読み込むと、ファイルからそのビューが展開されます。 ローディングが50回起こっているの場合、パフォーマンス上の問題に向かうことがあります。では、他に何ができますか?テーブルビューコントローラクラスで、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; 
} 

OK、あなたは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; 
} 

あなたのコードでビューを作成するための柔軟性を提供し、うまくいけばメモリにもそれを維持し、あなたのためにそれをキャッシュする必要があること:代わりに、コードの中で、あなたのビューを作成し、ファイルからデータをロードします。やってみて!

関連する問題