Gamal Elsayed
Gamal Elsayed

Reputation: 63

Programmatic UITableView is showing one cell only

A Swift newbie here. I'm trying to learn how to create different UI elements programmatically. I've hit the following wall..

I have 2 .swift files, on one hand we have...

import UIKit

struct MyTableView {

let myCustomTable: UITableView = {

    let aTable = UITableView()
        aTable.register(MyCustomCell.self, forCellReuseIdentifier: "myCell")

    return aTable
    }()

}

//  custom cell class, then add subviews (UI controls) to it

class MyCustomCell: UITableViewCell {

override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
    super.init(style: style, reuseIdentifier: reuseIdentifier)

    addSubview(aLabel)
    aLabel.frame = CGRect(x:0,
                          y:0,
                          width:self.frame.width,
                          height:self.frame.height)
}

required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
  }

}

//  stuff to add to the cell

let aLabel: UILabel = {

    let lbl = UILabel()
        lbl.text = "My Custom Cell"
        lbl.backgroundColor = UIColor.yellow   // just to highlight it on the screen

    return lbl
}()

On the other hand, we have the following view controller...

import UIKit

    class ViewControllerA: UIViewController, UITableViewDelegate, UITableViewDataSource {

        private let instanceOfViewControllerTable = MyTableView()

        override func loadView() {

            super.loadView()

                view.frame = UIScreen.main.bounds

            instanceOfViewControllerTable.myCustomTable.delegate = self
            instanceOfViewControllerTable.myCustomTable.dataSource = self

            instanceOfViewControllerTable.myCustomTable.frame = CGRect(x:0,
                                                                       y:0,
                                                                       width:self.view.frame.width,
                                                                       height:self.view.frame.height)

            self.view.addSubview(instanceOfViewControllerTable.myCustomTable)


        }


        func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
            return 5
        }

        func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

            return tableView.dequeueReusableCell(withIdentifier: "myCell", for: indexPath)

        }

    }

It builds and runs successfully, however, I'm getting the following result:

screenshot from table view

Now, my thinking is if I'm doing something wrong, the cell shouldn't appear at all. What I don't understand, why is it showing only on one cell in the array?

Your help is highly appreciated.

Upvotes: 0

Views: 25

Answers (1)

glyvox
glyvox

Reputation: 58069

You are declaring aLabel as a global variable. That way, only one instance exists from it. Move it inside your cell's class declaration.

class MyCustomCell: UITableViewCell {
    override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)

        addSubview(aLabel)
        aLabel.frame = CGRect(x:0,
                              y:0,
                              width:self.frame.width,
                              height:self.frame.height)
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    let aLabel: UILabel = {
        let lbl = UILabel()
        lbl.text = "My Custom Cell"
        lbl.backgroundColor = UIColor.yellow   // just to highlight it on the screen

        return lbl
    }()
}

Upvotes: 1

Related Questions