Swift UITableView 不显示内容

Posted

技术标签:

【中文标题】Swift UITableView 不显示内容【英文标题】:Swift UITableView does not show up the content 【发布时间】:2017-10-20 18:43:51 【问题描述】:

我有一个侧边菜单,我想为每个选择加载一个新的 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 被调用。

我尝试使用调试器对其进行调试,但没有结果。我只是不明白流程。

非常感谢。

【问题讨论】:

我试过了,但没有结果。我返回了 1 并且行为是一样的。 @FlorinAlexandru:哇,谢谢!我会用 viewWillAppear 听从你的建议 @FlorinAlexandru:不,它不起作用。一定有别的东西 viewWillAppear 被调用,但数据仍然不可见 我为什么要这样做?因为 tableData 数组可能没有正确或在正确的时间实例化?我什至尝试在 numberOfRowsInSection 方法中返回 10,它应该调用 cellForRowAt 10 次,对吗?还有哪些其他原因会导致不调用 cellForRowAt 函数? 【参考方案1】:

当您将另一个 viewController 的视图添加到您的视图层次结构中时,您必须告诉两个 viewController(请参阅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)

【讨论】:

非常感谢您的回答。我今晚会检查它。 伙计,你太棒了!您的解决方案解决了我的问题。它就像一个魅力!你得到了赏金+正确答案+赞成票。继续努力,并恭敬地感谢您!【参考方案2】:

在设置 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天了,我正在研究它,我还没有找到任何解决方案!我认为问题在于我使用 containerView 来添加新视图(包含 tableView)。这很烦人,因为这个问题我不得不重新考虑应用程序的整个架构。【参考方案3】:

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)

【讨论】:

Taras Chernyshenko:感谢您的回答。我会在几个小时后检查它是否有效。【参考方案4】:

转到ComissionsViewControllerviewDidLoad() 方法并在view.addSubview(tableView) 之后添加tableView.reloadData()——它会让你所有的麻烦都消失。

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

【讨论】:

Solomiya:我已经对此进行了测试,但它不适用于我的场景(参见上面 M. Kremer 的回答)。我的问题与我使用 containerView 在其中加载另一个视图有关。不过,谢谢你的回答。我会在几个小时后对其进行测试,看看它是否能解决我的问题。 我在上面的工作项目中添加了一个链接——所有代码都是你的,除了一行。我真的看不出它在你身边怎么可能行不通。唯一的情况是您没有提供有关您的情况的足够信息。 感谢您附上代码,Solomiya。我会在几个小时内对其进行测试,如果它解决了我的问题,我会告诉你。

以上是关于Swift UITableView 不显示内容的主要内容,如果未能解决你的问题,请参考以下文章

swift in UI test(测试UITableView中的单元格数)

Swift:数组、文本字段和 UITableView

UIScrollView 中的 Swift UITableView(不滚动)

ios开发系列之Swift_UI_UITableView

iOS - UIVIewController 中的 UITableView 不显示所有行 [Swift]

iOS Swift - UITableViewCell 自定义子类不显示内容