UITableView issue when using separate delegate/dataSource
Solution 1:
I followed your steps, recreated the project and ran into the same problem. Basically you are almost there. There are 2 things missing (once fixed it works):
-
You need to connect the
tableView
of theTableTestTableViewController
to theUITableView
you have on the screen. As I said before because it is notIBOutlet
you can override thetableView
property and make it andIBOutlet
:@interface TableTestTableViewController : UITableViewController { UITableView *tableView; } @property (nonatomic, retain) IBOutlet UITableView *tableView;
-
Next thing is to add a reference to the
TableTestTableViewController
and retain it in theTableTestViewController
. Otherwise yourTableTestTableViewController
may be released (after loading the nib with nothing hanging on to it.) and that is why you are seeing the erratic results, crashes or nothing showing. To do that add:@interface TableTestViewController : UIViewController { TableTestTableViewController *tableViewController; } @property (nonatomic, retain) IBOutlet TableTestTableViewController *tableViewController;
and connect that in the Interface Builder to the
TableTestTableViewController
instance.
With the above this worked fine on my machine.
Also I think it would be good to state the motivation behind all this (instead of just using the UITableViewController
with its own UITableView
). In my case it was to use other views that just the UITableView
on the same screenful of content. So I can add other UILabels
or UIImages
under UIView
and show the UITableView
under them or above them.
Solution 2:
I just spent many hours pulling my hair out trying to figure out why a UITableView
wouldn't show up when when I had it embedded in a separate nib instead of in the main nib. I finally found your discussion above and realized that it was because my UITableViewController
wasn't being retained! Apparently the delegate and datasource properties of UITableView
are not marked "retain" and so my nib was loading but the controller was getting tossed... And due to the wonders of objective-c I got no error messages at all from this... I still don't understand why it didn't crash. I know that I've seen "message sent to released xxx" before... why wasn't it giving me one of those?!?
I think most developers would assume that structure that they build in an interface builder would be held in some larger context (the Nib) and not subject to release. I guess I know why they do this.. so that the iPhone can drop and reload parts of the nib on low memory. But man, that was hard to figure out.
Can someone tell me where I should have read about that behavior in the docs?
Also - about hooking up the view. First, if you drag one in from the UI builder you'll see that they hook up the view property (which is an IBOutlet
) to the table view. It's not necessary to expose the tableView
, that seems to get set internally. In fact it doesn't even seem to be necessary to set the view unless you want viewDidLoad
notification. I've just broken the view connection between my uitableview
and uitableviewcontroller
(only delegate and datasource set) and it's apparently working fine.