cellForRowAtIndexPath: not called
ios, iphone, uitableview
Solution
One valid scenario for why `numberOfRowsInSection` would be called but `cellForRowAtIndexPath` would not be called is when the size or positioning of the table does not require any rows to be displayed.
For example, let's say you had a table that was 20 pixels high, but the header for the first section was 30 high and you returned nil for the header (or did not implement `viewForHeaderInSection`). In this case, no rows would be displayed and it would look like the table just isn't there.
I see you are using IB. The sizing of the table can be deceptive in IB as it is assuming header and footer sizes. I would log the frame for the table so you understand where it is when the appliction is run (versus where it appears in IB). I would also be sure to manually size and position the table's frame before calling reloadData. This will solve this valid case where `cellForRowAtIndexPath` is not called.
Problem
My app has two states: logged in and not logged in, and I have the following architecture (vastly simplified): - ViewController A which contains a search box and a table view. - ViewController B which is used for logging in the app. The flow is the following: - the user is not logged in; - A is pushed on the stack. In `viewWillAppear` I check if the user is logged in and if yes, an async network request is being made and, once that is done, the table is loaded with the data from the network. However since the user is not logged in at this point, the table view is empty; - the user taps on the search box; because he's not logged in, B is pushed (after a confirmation); - he logs in successfully in B, then presses a button which pops B and shows A again; - at this point in time, because he's logged in, from `viewWillAppear` I do the async request; - when that is completed, I call `reloadData` on the table view. What I notice is that `numberOfRowsInSection:` is called and it returns the correct result, however `cellForRowAtIndexPath:` is NOT called afterwards and the table remains empty. I've checked and `reloadData` is called on the main thread. Any idea what can it be? Cause it's driving me nuts! Thanks, S. EDIT: Here's the async bit of code from `viewWillAppear` in A. ``` if ([User isLoggedIn]) { [self.asyncRequest fetchDataWithCompletionHandler:^(id response, NSError *error) { [UIApplication sharedApplication].networkActivityIndicatorVisible = NO; if (error) { [Utils displayError:error]; } else { self.array = response; self.isLoaded = YES; [self.tableView reloadData]; [self.tableView setContentOffset:CGPointMake(0.0f, 0.0f) animated:NO]; } }]; } ``` I've checked that the async request completes successfully and that `response` contains the correct data (this is the array used to back the `UITableView`). After `reloadData`, I've put a breakpoint in `tableView:numberOfRowsInSection:` and it stops there and it returns the correct number of elements in `array`. After that, however, the breakpoint in `tableView:cellForRowAtIndexPath:` is never hit.