UITableView - registerClass with Swift

55.4k Views Asked by At

Is anyone else having an issue using the tableView.registerClass method with Swift?

It no longer comes in code completion for me (nor can I use it if manually typed) but it is still in the headers...

Code Completion

UITableView headers

10

There are 10 best solutions below

5
Woodstock On BEST ANSWER

It works for me perfectly.

self.tableView.register(UITableViewCell.self, forCellReuseIdentifier: "cell")

Exactly as I have it above.

3
Henry Heleine On

Switching the order in which I called registerNib and registerClass worked for me!

For some reason my app crashed when I had:

...registerNib.....

...registerClass...

But ran fine when I had:

...registerClass...

...registerNib.....

Hope that helps some of you.

0
Dinesh Katwal On

For Swift 2.2 Register For Default Cell From Class

self.tableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: "DefaultCell")



For Swift 3.0 Register For Default Cell From Class

self.tableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: "DefaultCell")



For Swift 2.2 Register For Default Cell From Nib

self.tableView.registerNib(UINib(nibName: "CustomCellName", bundle: nil), forCellReuseIdentifier: "CustomCellIdentifer")



For Swift 3.0 Register For Default Cell From Nib

self.tableView.registerNib(UINib(nibName: "CustomCellName", bundle: nil), forCellReuseIdentifier: "CustomCellName")

Note: Storyboard created cell is called prototype cell and have some procedure to register prototype cell like Nib.And Don't forget to set the cell identifier like below. enter image description here

0
Qiulang On

Swift has once again renamed it to

tableView.register(UITableViewCell.self, forCellReuseIdentifier:"DefaultCell")

Really don't understand why they bothered so much about this particular naming

0
Amit Thakur On

For swift 3 refer this. It works!

Inside you viewdidload function

self.tableView.register(UITableViewCell.self, forCellReuseIdentifier: "LabelCell")

0
Rinju  Jain On

For swift 4

self.tableView.register(UITableViewCell.self, forCellReuseIdentifier: "Cell")
0
Gurjinder Singh On

Swift 4 and 4.1. making generic methods it is very easy to register and dequeue table cell.

       override func viewDidLoad() {
                super.viewDidLoad()
                self.tblView.register(CellProfileOther.self) // cell class name
       }
        func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
                let cell: CellProfileOther = tableView.dequeueReusableCell(forIndexPath: indexPath)
                return cell
            }
        extension UITableView {
        func register<T:UITableViewCell>(_: T.Type) where T: ReusableView, T: NibLoadableView {
                let bundle = Bundle(for: T.self)
                let nib = UINib(nibName: T.nibName, bundle: bundle)
                self.register(nib, forCellReuseIdentifier: T.defaultReuseIdentifier)
            }
        func dequeueReusableCell<T:UITableViewCell>(forIndexPath indexPath: IndexPath) -> T where T: ReusableView {
                guard let cell = self.dequeueReusableCell(withIdentifier: T.defaultReuseIdentifier, for: indexPath) as? T else {
                    fatalError("Could not dequeue cell with identifier: \(T.defaultReuseIdentifier)")
                }
                return cell
            }
        }

        protocol ReusableView: class {
            static var defaultReuseIdentifier: String { get }
        }

        protocol NibLoadableView: class {
            static var nibName: String { get }
        }

        extension ReusableView where Self: UIView {
            static var defaultReuseIdentifier: String {
                return String(describing: Self.self)
            }
        }    
        extension NibLoadableView where Self: UIView {
            static var nibName: String {
                return String(describing: Self.self)
            }
        }

   // Here is cell class 
    class CellProfileOther: UITableViewCell, ReusableView, NibLoadableView  {
    }
0
swiftBoy On

Updated for Swift 5

Register TableView Cell in viewDidLoad If you are using Default Cell

tableView.register(UITableViewCell.self, forCellReuseIdentifier: "MyTableCell")

Register TableView Cell in viewDidLoad If you are using Custom Nib/XIB Cell

tableView.register(UINib(nibName: "MyCustomCell", bundle: nil), forCellReuseIdentifier: "MyCustomCell")
0
Zgpeace On

I prefer to use TableViewCell.self to generate the identifier string. It can reduce the typing error.

tableView.register(MyCell.self, forCellReuseIdentifier: String(describing: MyCell.self))
1
jane doe On
  let cellIds = ["TableViewCell","TableViewCell1", "TableViewCell2", ]
    for cell in cellIds{
          tableView.register(UINib(nibName: cell, bundle: nil), forCellReuseIdentifier: cell)