0

多くの依存関係を含む大きなアプリを入手しました。このケースRootTableViewControllerでは、テーブル ビュー コントローラーが必要になるたびに実行する必要があるすべてのものを処理するために呼び出されるクラスを実装しました。

今、無限ループを発見しましたが、それを修正する方法がわかりません。で次のコードを取得しましたRootTableViewController

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
    NSString *sectionTitle = [self tableView:tableView titleForHeaderInSection:section];
    int numbersOfRowInSection = [self.tableView numberOfRowsInSection:section];

    if (numbersOfRowInSection > 0)
    {
         // ...
    }
    else
    {
        UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 320.0f, 28.0f)];
        return view;
    }
}

[tableView numberOfRowsInSection]これは iOS 5 と iOS 6 では完全に機能しますが、iOS4 ではが を呼び出しているため、無限ループが発生します[tableView viewForHeaderInSection]。テーブル ビュー API を使用してこれを修正するにはどうすればよいですか? さまざまなデータソースで[ count]これを拡張する多くのテーブルビューコントローラーを取得したため、内部データ配列を操作するのは解決策ではありません。RootTableViewController

4

2 に答える 2

1

これは単に良いスタイルではありません。関連するデリゲートメソッドをサブクラス化または実装することになっていますが、呼び出さないでくださいUITableView.numberofRowsInSection:

ただし、確かにを実装していますtableView:numberOfRowsInSection。そのすべての機能を新しいメソッドに移動しますmyNumberOfRowsInSection:。同じことを行います。それは主にあなたの現在のコピーですnumberOfRowsInSection。次に、ここでコードスニプレット呼び出しを行います[self myNumberOfRowsInSection:...];

そして、tableView:numberOfRowsInSection:sectionただ行う:

return [self myNumberOfRowsInSection:section]; 

自分で呼び出す可能性のあるすべてのデリゲートメソッドに同じパターンを適用します。すべてのビジネスロジックを独自のメソッドに移動してから、デリゲートメソッドと独自のコードからのみ独自のメソッドを呼び出します。

于 2013-03-19T19:07:07.783 に答える
0

dataSource内部データ配列にアクセスせずにデータ ソースのセクションの行数を取得する場合は、次のようにデリゲートにクエリを実行できます。

int numbersOfRowInSection = [self.tableView.dataSource tableView:self.tableView numberOfRowsInSection:section];

(コンパイラチェックなし)

于 2013-03-19T15:17:44.077 に答える