59
votes

For better re-usability I want to create a table view outside of my Storyboard.

Now when I create a UITableView based ViewController with Nib in Xcode I get the default TableView in the nib file. However, I am not able in Interface Builder to add prototype cells like I am in my Storyboard.

Is it currently not possible to add prototype cells in a nib or am I missing something.

Thanks very much for any help.

2
In addition to correct answer above I would refer to great detailed solution for this case. - Link to StackAnswer (by using UITableView: registerNib:forCellReuseIdentifier: and tableView:cellForRowAtIndexPath: with .xib files)skywinder
This question/answer is a bit confusing to me. I came here looking for a way to use prototype cells within a table view when defining a table view in a xib. It's perfectly possible in a storyboard yes, but somehow within a xib there just is no such feature.Jonny

2 Answers

92
votes

iOS 5 includes a new method on UITableView: registerNib:forCellReuseIdentifier:

To use it, put a UITableViewCell in a nib. It has to be the only root object in the nib.

You can register the nib after loading your tableView, then when you call dequeueReusableCellWithIdentifier: with the cell identifier, it will pull it from the nib, just like if you had used a Storyboard prototype cell.

7
votes

In Swift 4:

  1. Create new CocoaTouch Class, Subclass from UITableViewCell.
  2. Important - Enable the checkbox 'Also create XIB file' which creates a Swift file and a .xib file
  3. Add labels in the Xib, as you would do for a prototype cell in Storyboard
  4. Connect label outlets to the new swift file
  5. Important - Register the nib file in viewDidLoad

    yourTableview.register(UINib.init(nibName: "CustomCellTableViewCell", bundle: nil), forCellReuseIdentifier: "Cell")
    

    (or)

    yourTableview.register(UINib(nibName: "CustomCellTableViewCell", bundle: Bundle.main), forCellReuseIdentifier: "Cell")
    
  6. Implement the datasource and delegates as normal and typecaste to the CustomCell in cellForRowAtIndexPath.