Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

cellForRowAtIndexPath is not called sometimes after calling numberOfRowsInSection on calling reloadData

I have a simple application where I have a table view & depending on the callback with array I reload the table data using reloadData method. Initially for first 5-10 times of loading this table view works without any problem. After playing with the application for sometimes I noticed that the table view is blank because of the reason that cellForRowAtIndexPath is not called by the framework. I verified that datasource & delegate is set properly & numberOfRowsInSection is returning a valid positive number. Once I see the blank table view then I can see this blank view repeatedly until I exit the application. I do not get any error or warnings in the console. I tried to tweak the array but to no avail.

Here is the code:

- (void)notifyArrayLoaded:(NSArray *)arr {
    NSUInteger capacity = [arr count];
    _tbDataArray = [[NSMutableArray alloc] initWithCapacity:capacity];

    // _tbDataArray is filled with the data from arr

    // Reload the table data
    [_tableView reloadData]; 
}

Any clue will be highly appreciated.

Thanks in advance. Sumit

Hi DeanWombourne, I do not have viewDidUnLoad method but I have viewWillDisAppear method which I am posting it here.

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    [UIApplication sharedApplication].statusBarOrientation = UIInterfaceOrientationPortrait;
    [[UIApplication sharedApplication] setStatusBarHidden:NO animated:NO];
    [self.navigationController setNavigationBarHidden:NO animated:NO];

    UIWindow *window = [[UIApplication sharedApplication] keyWindow];
    UIView *view = [window.subviews objectAtIndex:0];

    view.transform = CGAffineTransformIdentity;
    view.transform = CGAffineTransformMakeRotation(0);
    view.bounds = CGRectMake(0.0, 0.0, 320, 480);
}

This is the logs of tableView as logged.

[numberOfSectionsInTableView:] [Line 223] <UITableView: 0xa5fc00; frame = (0 0; 320 0); clipsToBounds = YES; layer = <CALayer: 0x4830b0>; contentOffset: {0, 0}>
[tableView:numberOfRowsInSection:] [Line 229] <UITableView: 0xa5fc00; frame = (0 0; 320 0); clipsToBounds = YES; layer = <CALayer: 0x4830b0>; contentOffset: {0, 0}>
<UITableView: 0xa5fc00; frame = (0 0; 320 0); clipsToBounds = YES; layer = <CALayer: 0x4830b0>; contentOffset: {0, 0}>
[numberOfSectionsInTableView:] [Line 223] <UITableView: 0xa5fc00; frame = (0 0; 320 0); clipsToBounds = YES; layer = <CALayer: 0x4830b0>; contentOffset: {0, 0}>
[tableView:numberOfRowsInSection:] [Line 229] <UITableView: 0xa5fc00; frame = (0 0; 320 0); clipsToBounds = YES; layer = <CALayer: 0x4830b0>; contentOffset: {0, 0}>
like image 943
Sumit Avatar asked May 05 '11 08:05

Sumit


2 Answers

Make sure you call reloadData on the main thread. If you are loading your data asynchronously using performSelectorInBackground and calling reloadData in that method, you should, instead of doing something like:

[tableViewController reloadData]

What you should be doing is

[tableViewController performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO]
like image 101
Florian Segginger Avatar answered Oct 23 '22 23:10

Florian Segginger


If reloadData causes numberOfRowsInSection to be called but not cellForRowAtIndexPath, check that the UITableView instance you called reloadData on is the same UITableView that you have displayed in your view, e.g.

NSLog(@"Calling reloadData on %@", self.tableView);
[self.tableView reloadData];

I think you'll find you have two different UITableViews. The puzzle then is working out why...

like image 31
Nestor Avatar answered Oct 23 '22 23:10

Nestor