I have a UITableView as a subview in a UIViewController. I\'m not using UITableViewController because I have some other content that is not tableview-related taking up part of t
Here are some tips:
Basically there can be 3 ways to create and use UITableViewCell
s:
Use “prototype” cells in the storyboard/nib
(Create cell UI in the storyboard/nib inside UITableView
)
You should not use either registerClass:forCellReuseIdentifier:
or registerNib:forCellReuseIdentifier:
methods. UIStoryboard
handles it on its own, since you specified the reuseIdentifier
in the storyboard, the tableView
knows which cell is associated with which reuseIdentifier
.
Use a separate nib for tableViewCell
UI
(This might be a way to go when you want to use the same tableViewCell
in several tableView
s)
You should use registerNib:forCellReuseIdentifier:
method.
Do not use nibs, create tableViewCell
UI programmatically
You should use registerClass:forCellReuseIdentifier:
method.
Also, note that both registerClass:forCellReuseIdentifier:
and registerNib:forCellReuseIdentifier:
should be called before (most often in viewDidLoad
) dequeueReusableCellWithIdentifier:forIndexPath:
method is called. If you registered a class or a nib for the reuseIdentifier
it is guaranteed that dequeueReusableCellWithIdentifier:forIndexPath:
returns a valid cell (unlike dequeueReusableCellWithIdentifier:
).
In your code Storyboard
registered a nib
with UI for the cell, but you calling registerClass:forCellReuseIdentifier:
with the same reuseIdentifier
forced table view to unregister the nib and register the class which was not aware of IBOutlet
s.
Removing the call to
[self.tableView registerClass:[SWTableViewCell class] forCellReuseIdentifier:@"Cell"];
solves the issue.
I don't know exactly what this method does as I've never used it, so I'll look into it. If anyone has information on wether or not this call is required for something, please tell us !
Edit :
So, the idea behind registerClass:forCellReuseIdentifier:
is that it tells the tableView how to create new cells. That way, if dequeueReusableCellWithIdentifier:
does not return a cell (if the queue is empty), the tableView knows how to create a new cell, and you don't need to manually create one).
Edit 2 :
I found this thread, in which it says :
If the cell is created using prototypes within a storyboard it is not necessary to register the class.
Simply calling dequeueReusableCellWithReuseIdentifier:
will "activate" the cell reusing functionality of your tableView.
So registerClass:forCellReuseIdentifier:
is to be called only if you manually build your cells, without the use of storyboards.