2013-03-19 4 views
0

У меня есть большое приложение, содержащее множество зависимостей. В этом случае я реализовал класс с именем RootTableViewController, чтобы обрабатывать все материалы, которые нужно делать каждый раз, когда требуется контроллер табличного представления.tableView numberOfRowsInSection вызывает tableView viewForHeaderInSection на iOS4

Теперь я обнаружил бесконечный цикл, и я не знаю, как его исправить. Я получил следующий код в 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; 
    } 
} 

Это отлично работает на прошивке 5 и IOS 6, а на iOS4 она вызывает бесконечный цикл, потому что [tableView numberOfRowsInSection] звонит [tableView viewForHeaderInSection]. Как я могу исправить это, используя api таблицы? У меня нет решения для работы с [ count] внутренних массивов данных, потому что у меня появилось множество контроллеров табличных представлений, расширяющих этот RootTableViewController с различными источниками данных.

ответ

0

Если вы хотите, чтобы получить число строк в секции источника данных без доступа внутреннего массива данных, вы можете запросить dataSource делегата для него, что-то вроде

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

(не компилятор проверил)

+0

Это будет работать. В большинстве случаев self.talbeView.dataSource и self.tableView.delegate будут указывать на себя в любом случае :) –

1

Это просто не очень хороший стиль. Предполагается, что подкласс или rahter реализует связанный метод делегата, но вы не вызываете UITableView.numberofRowsInSection:

Однако вы, конечно же, внедрили tableView:numberOfRowsInSection. Переместите все его функциональные возможности в новый метод. myNumberOfRowsInSection: Там же. Это в основном копия вашего текущего numberOfRowsInSection. Тогда здесь, в вашем коде sniplet называют [self myNumberOfRowsInSection:...];

И в tableView:numberOfRowsInSection:section просто сделать:

return [self myNumberOfRowsInSection:section]; 

Применить тот же шаблон для всех методов делегата, которые вы можете назвать себя. Переместите всю свою бизнес-логику в свой собственный метод, а затем вызовите только свой метод из метода делегата и из собственного кода.

Смежные вопросы