Create UITableView programmatically in Swift

前端 未结 8 1300
青春惊慌失措
青春惊慌失措 2020-12-12 12:00

I try to implement UITableView programmatically without use of xib or Storyboards. This is my code:

ViewController.swift

import UIKi         


        
相关标签:
8条回答
  • 2020-12-12 12:37

    Note: As you mentioned you just started programming in Swift. I created a tableView programmatically. Copy and paste below code into your viewController and run the project...

    import UIKit
    
    class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
    
        private let myArray: NSArray = ["First","Second","Third"]
        private var myTableView: UITableView!
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            let barHeight: CGFloat = UIApplication.shared.statusBarFrame.size.height
            let displayWidth: CGFloat = self.view.frame.width
            let displayHeight: CGFloat = self.view.frame.height
    
            myTableView = UITableView(frame: CGRect(x: 0, y: barHeight, width: displayWidth, height: displayHeight - barHeight))
            myTableView.register(UITableViewCell.self, forCellReuseIdentifier: "MyCell")
            myTableView.dataSource = self
            myTableView.delegate = self
            self.view.addSubview(myTableView)
        }
    
        func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
            print("Num: \(indexPath.row)")
            print("Value: \(myArray[indexPath.row])")
        }
    
        func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
            return myArray.count
        }
    
        func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
            let cell = tableView.dequeueReusableCell(withIdentifier: "MyCell", for: indexPath as IndexPath)
            cell.textLabel!.text = "\(myArray[indexPath.row])"
            return cell
        }
    }
    

    Output:

    0 讨论(0)
  • 2020-12-12 12:38

    Simple solution

    import UIKit
    
    class CustomTableViewController: UICollectionViewController {
        override func viewDidLoad() {
            super.viewDidLoad()
            tableView.register(UITableViewCell.self, forCellReuseIdentifier: "Cell")
        }
    
        override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
            return 10
        }
    
        override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
            let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath as IndexPath)
            cell.textLabel!.text = "\(indexPath.row)"
            return cell
        }
    }
    
    0 讨论(0)
  • 2020-12-12 12:40

    I had a similar issue in that the data would not populate for my programmatic UITableView. This was because I was using a delegate/dataSource without a strong reference. Once I kept a reference to it (I had one class implementing both UITableViewDataSource and UITableViewDelegate), the data was populated.

    0 讨论(0)
  • 2020-12-12 12:46

    It makes no sense that you are using a UITableViewController as the data source and delegate for your view controller's table view. Your own view controller should be the table view's data source and delegate.

    Since you seem to want a view controller with a table view that doesn't take up the entire view, move every thing to your view controller as follows:

    ViewController.swift:

    import UIKit
    
    class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            let tableView: UITableView = UITableView()
            tableView.frame = CGRect(x: 10, y: 10, width: 100, height: 500)
            tableView.dataSource = self
            tableView.delegate = self
    
            self.view.addSubview(tableView)
        }
    
        func numberOfSectionsInTableView(tableView: UITableView) -> Int {
            NSLog("sections")
            return 2
        }
    
        func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
            NSLog("rows")
            return 3
        }
    
        func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
            NSLog("get cell")
            let cell = UITableViewCell(style: UITableViewCellStyle.Value1, reuseIdentifier: "Cell")
            cell.textLabel!.text = "foo"
            return cell
        }  
    }
    
    0 讨论(0)
  • 2020-12-12 12:52
    import UIKit
    
    class ViewController: UITableViewController {
    
    override func viewDidLoad() {
        super.viewDidLoad()
    
        tableView.register(TableCell.self, forCellReuseIdentifier: "cell")
    }
    
    override func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }
    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 10
    }
    
    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! TableCell
        cell.nameLabel.text = "TableViewCell programtically"
        cell.nameLabel.textAlignment = .center
        cell.nameLabel.textColor  = .white
        return cell
    }
    
    override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return 100
    }
    }
    
    0 讨论(0)
  • 2020-12-12 12:53

    Swift 4 compatible

    Instead of adding a UITableView to your UIViewController, you should consider creating a UITableViewController and avoid setting up delegates:

    class YourTVC: TableViewController {
    
      override func viewDidLoad() {
        super.viewDidLoad()
    
        // setup custom cells if you use them
        tableView.register(CustomTableViewCell.self, forCellReuseIdentifier: "yourCell")
      }
    
      // MARK: tableView
      override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 3 // set to value needed
      }
    
      override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "yourCell", for: indexPath) as! CustomTableViewCell
        cell.textLabel?.text = "Cell at row \(indexPath.row)"
        return cell
      }
    
    }
    
    0 讨论(0)
提交回复
热议问题