cellForRowAtIndexPath не вызывается; разделы возвращают 1, а строки возвращают 4 - PullRequest
5 голосов
/ 22 октября 2009

После анализа данных JSON в классе Data я установил свойство заголовков NSArray * UIViewController в методе fillArrays того же класса Data. В методе viewDidAppear моего UIViewController я вызываю reloadData для своего UITableView. numberOfSectionsInTableView запускается и возвращает 1, затем запускается numberOfRowsInSection и возвращает количество массивов 4 (для 4 строк в массиве). Тем не менее, управление никогда не попадает в cellForRowAtIndexPath, и мне труднее всего понять, почему, тем более что у меня есть действительные разделы и строки. Все клетки видны.

Я добавил протоколы UITableViewDataSource и UITableViewDelegate в интерфейс UIViewController и установил делегат UITableView и dataSource на self в viewDidLoad (что также проверяется вызываемыми методами подсчета строк и разделов).

Мне интересно, есть ли у него какая-то причина для повторной инициализации UIViewController в Data.m для установки его свойств.

In Data.m:

- (void)fillArrays:(NSArray *)jsonObjs {
    NSLog(@"fillArrays");               
    HeadlinesRootViewController *hrvc = [[HeadlinesRootViewController alloc] init];
    hrvc.headlines = [self getJsonValuesForKey:@"headline" inArrayOfObjects:jsonObjs];
    [hrvc viewDidAppear:NO];
}

В ViewController.m:

- (void)viewDidLoad {
    [super viewDidLoad];
    NSLog(@"viewDidLoad");
    // Table view
    headlineTableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 180, self.view.bounds.size.width, 300) style:UITableViewStylePlain];
    [headlineTableView setDelegate:self];
    [headlineTableView setDataSource:self];
    // Temporary
    self.headlines = [[NSMutableArray alloc] initWithObjects:@"headline1", @"headline2", @"headline3", @"headline4", nil];



    [self.view addSubview:headlineTableView];
    self.headlineTableView = headlineTableView;
    [headlineTableView release];
}
- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    NSLog(@"viewdidappear");
    NSLog(@"headlines: %@", self.headlines); // Returns an array of 4 headlines
    if( [self.headlines count] != 0 ){
        [self.headlineTableView reloadData];
    }
}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    NSLog(@"numberOfSectionsInTableView: 1");
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    NSLog(@"numberOfRowsInSection: %d", [self.headlines count]);
    return [self.headlines count];
}

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

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];
    }

    cell.text = [[NSString alloc] initWithFormat:@"%@", [self.headlines objectAtIndex:indexPath.row]];

    return cell;
}

Ответы [ 8 ]

4 голосов
/ 21 ноября 2011

Вы добавили tableView к представлению UIViewController?

Это случилось со мной, и когда я добавил это

[self.view addSubview:table];
[table release];

затем cellForRowAtIndexPath начал работать.

4 голосов
/ 04 июля 2012

Ради Google:

Если tableView:numberOfRowsInSection вернет ноль по любой причине, то tableView:cellForRowAtIndexPath не будет вызван, потому что нет строк для вызова.

4 голосов
/ 23 октября 2009

В fillArrays вы создаете другой контроллер представления - но вы никогда не будете ничего делать с ним или его представлением, вы никогда не увидите это представление. Вы также никогда не вызовете viewDidAppear вручную, что происходит автоматически при отображении представления контроллеров представления (ТОЛЬКО в контексте контроллера навигации).

Обычно поток таков, вы создаете контроллер представления и либо добавляете это представление в качестве подпредставления текущего представления, либо выдвигаете его как новое окно через контроллер навигации. Я почти уверен, что вся ваша проблема в том, что их таблица никогда не добавляется в представление, которое на самом деле видит кто-либо, поэтому таблица вызывает другие методы, но никогда не вызывает cellForRow, потому что ее код layoutSubviews просто не вызывается.

0 голосов
/ 07 сентября 2012

Большое спасибо pxl. Когда я перемещаю инициализацию UITableView из viewDidLoad в:

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil"

это прекрасно работает, когда я делаю удаление или обновление некоторых строк, UITableView перезагружается в мой UIView.

0 голосов
/ 30 октября 2011

Я не уверен, что вы добавили свой UITableView в качестве подпредставления к UIViewController.view. Это был мой подход в любом случае.

В этом подходе я обнаружил, что выполнение не попадало в cellForRowAtIndexPath, пока я не отправил UIViewController.view назад после добавления UITableView в качестве подпредставления.

Добраться до этого было только частью проблемы. В этот момент казалось, что другие мои контроллеры представления больше не реагируют на сенсорные события. Я обнаружил, что когда я также добавляю UITableView в качестве подпредставления к rootViewController, все мои представления получают соответствующие сенсорные события.

0 голосов
/ 22 октября 2009

если вы устанавливаете делегат и источник данных в viewDidLoad, то это может быть источником вашей ошибки. Можете ли вы установить источник данных и делегировать в init?

0 голосов
/ 22 октября 2009

Я не вижу ничего плохого в коде «как есть», вы проверили с помощью точек останова, что cellForRow никогда не достигается (даже если я вижу, что у вас есть оператор log)?

Также я бы попробовал просто для проверки работоспособности вернуть «1» явно в rowInSection и жестко закодировать строку в ячейке, которую вы возвращаете в cellForRow.

Если ничего не помогает, создайте новый контроллер табличного представления из шаблонов XCode и отправьте туда свои вызовы - тогда, когда это сработает, вернитесь назад к тому, почему ваш код не работает.

Также было бы неплохо увидеть ваш установочный код viewDidLoad (добавьте, пожалуйста, для ответа выше).

0 голосов
/ 22 октября 2009

Убедитесь, что делегат tableView и dataSource указаны на viewController

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...