Swift UITableView没有显示内容

时间:2017-10-20 18:43:51

标签: ios swift uitableview viewcontroller

我有一个侧边菜单,每个选择我想加载一个新的ViewController(基本上每个页面都有一个单独的ViewController)。

这是加载新ViewController的相关代码:

    viewController = storyboard!.instantiateViewController(withIdentifier: "commissionsViewController")

    var viewInAction = UIView()

    viewInAction = viewController.view

    let gestureRecognizer = UITapGestureRecognizer(target: self, action:  #selector(self.tapOnView))

    viewInAction.addGestureRecognizer(gestureRecognizer)

    viewInAction.layer.backgroundColor = UIColor(red: 0.0, green: 0.0, blue: 0.0, alpha: 0.0).cgColor

    viewInAction.translatesAutoresizingMaskIntoConstraints = false


    if let subview = containerView.viewWithTag(100) {
        subview.removeFromSuperview()
    }


    containerView.insertSubview(viewInAction, belowSubview: menuView)

    setConstrainsOnView(viewObject: viewInAction)

这是加载的ViewController的代码:

import UIKit

class CommissionsViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

var tableView = UITableView()
var tableData = ["Beach", "Clubs", "Chill", "Dance"]

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

    tableView = UITableView(frame: self.view.bounds, style: UITableViewStyle.plain)
    tableView.dataSource = self
    tableView.delegate = self
    tableView.backgroundColor = UIColor.blue

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

    tableView.contentInset.top = 20

    let contentSize = self.tableView.contentSize
    let footer = UIView(frame: CGRect(x: self.tableView.frame.origin.x,
                                      y: self.tableView.frame.origin.y + contentSize.height,
                                      width: self.tableView.frame.size.width,
                                      height: self.tableView.frame.height - self.tableView.contentSize.height))

    self.tableView.tableFooterView = footer


    view.addSubview(tableView)

}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "my", for: indexPath)
    cell.textLabel?.text = "This is row \(tableData[indexPath.row])"

    return cell
}

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

问题:正如您所看到的,CommissionsViewController包含以编程方式添加的tableView。那个tableView没有显示任何单元格!基本上从不调用 cellForRowAt 方法!我不明白为什么!

我可以看到一个蓝色视图,这是tableView的背景,所以tableView已经就位,但它没有加载单元格!

调用方法 numberOfRowsInSection

我尝试使用调试器调试它但没有结果。我根本不了解流程。

谢天谢地。

4 个答案:

答案 0 :(得分:1)

当您将另一个viewController的视图添加到视图层次结构时,您必须告诉两个viewControllers(有关详细信息,请参阅this answer)。

像这样添加addChildViewControllerdidMoveToParentViewController来电:

viewController = storyboard!.instantiateViewController(withIdentifier: "commissionsViewController")

self.addChildViewController(viewController)
var viewInAction = viewController.view
let gestureRecognizer = UITapGestureRecognizer(target: self, action:  #selector(self.tapOnView))
viewInAction.addGestureRecognizer(gestureRecognizer)
viewInAction.layer.backgroundColor = UIColor(red: 0.0, green: 0.0, blue: 0.0, alpha: 0.0).cgColor
viewInAction.translatesAutoresizingMaskIntoConstraints = false
if let subview = containerView.viewWithTag(100) {
    subview.removeFromSuperview()
}
containerView.insertSubview(viewInAction, belowSubview: menuView)
setConstrainsOnView(viewObject: viewInAction)
viewController.didMoveToParentViewController(self)

答案 1 :(得分:0)

设置dataSource并将其委托给self后,您永远不会让tableView加载任何数据。这意味着你需要在viewDidLoad()的末尾调用tableView.reloadData()

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

    tableView = UITableView(frame: self.view.bounds, style: UITableViewStyle.plain)
    tableView.dataSource = self
    tableView.delegate = self
    tableView.backgroundColor = UIColor.blue

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

    tableView.contentInset.top = 20

    let contentSize = self.tableView.contentSize
    let footer = UIView(frame: CGRect(x: self.tableView.frame.origin.x,
                                      y: self.tableView.frame.origin.y + contentSize.height,
                                      width: self.tableView.frame.size.width,
                                      height: self.tableView.frame.height - self.tableView.contentSize.height))

    self.tableView.tableFooterView = footer


    view.addSubview(tableView)
    tableView.reloadData()

}

答案 2 :(得分:0)

viewDidLoad方法view已加载但大小不正确。 尝试以下一种方式更改UITableView的初始化

let screenBounds = UIScreen.main.bounds
let rect = CGRect(x: 0, y: 0, width: screenBounds.width, height: screenBounds.height)
tableView = UITableView(frame: rect, style: UITableViewStyle.plain)

答案 3 :(得分:0)

转到ComissionsViewControllerviewDidLoad()方法并在tableView.reloadData()之后添加view.addSubview(tableView) - 这会让您的所有烦恼都消失。

UPD:我刚刚做了一个测试项目。我复制了你发布的代码,只评论了几条不相关的代码。我做的唯一重要区别是添加了我上面提到的代码行。您可以下载并运行它以查看它的工作原理:) https://drive.google.com/file/d/0B55tO8S_7Ag7VnppMk1fWlg5dWM/view