未调用UITableView委托方法。从另一个类创建

时间:2017-06-29 12:51:45

标签: ios swift uitableview

我正在尝试从其他类添加UITableView,但未调用delegate方法。仅调用numberOfRowsInSection方法。我知道我可以在主ViewController中做到这一点,但我想从另一个班级做到这一点。可能吗?此代码功能齐全,只需复制并粘贴到项目中即可。谢谢!

import UIKit

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        let t = Table()
        t.create()
    }
}

class Table: UIViewController, UITableViewDelegate, UITableViewDataSource {

    private let myArray: NSArray = ["First","Second","Third"]

 func create() {
        let barHeight = UIApplication.shared.statusBarFrame.size.height
        let displayWidth = UIScreen.main.bounds.width
        let displayHeight = UIScreen.main.bounds.height

        let myTableView = UITableView(frame: CGRect(x: 0, y: barHeight, width: displayWidth, height: displayHeight - barHeight))
        myTableView.register(UITableViewCell.self, forCellReuseIdentifier: "MyCell")
        UIApplication.shared.delegate?.window??.rootViewController?.view.addSubview(myTableView)
        myTableView.dataSource = self
        myTableView.delegate = self
        myTableView.backgroundColor = UIColor.red
    }

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        print("Num: \(indexPath.row)")
        print("Value: \(myArray[indexPath.row])")
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        print("numberOfRowsInSection")
        return myArray.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        print("cellForRowAt")
        let cell = tableView.dequeueReusableCell(withIdentifier: "MyCell", for: indexPath as IndexPath)
        cell.textLabel!.text = "\(myArray[indexPath.row])"
        return cell
    }

}

2 个答案:

答案 0 :(得分:2)

运行时:

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        let t = Table()
        t.create()
    }
}

您已创建 本地 变量t。离开viewDidLoad()函数后,t不再存在 - 因此没有代理方法可以调用。

相反,创建一个可以坚持的类级变量:

class ViewController: UIViewController {

    let t = Table()

    override func viewDidLoad() {
        super.viewDidLoad()
        t.create()
    }
}

答案 1 :(得分:0)

我认为它没有被调用,因为Tablview没有添加到self.view或者其他。所以你需要在设置tableview后添加这一行。

func create() {
        let barHeight = UIApplication.shared.statusBarFrame.size.height
        let displayWidth = UIScreen.main.bounds.width
        let displayHeight = UIScreen.main.bounds.height

        let myTableView = UITableView(frame: CGRect(x: 0, y: barHeight, width: displayWidth, height: displayHeight - barHeight))
        myTableView.register(UITableViewCell.self, forCellReuseIdentifier: "MyCell")
        UIApplication.shared.delegate?.window??.rootViewController?.view.addSubview(myTableView)
        myTableView.dataSource = self
        myTableView.delegate = self
        myTableView.backgroundColor = UIColor.red
        self.view.addSubview(myTableView) //add this line 
    }