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 了解更多信息)。
像这样添加addChildViewController
和didMoveToParentViewController
调用:
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】:转到ComissionsViewController
、viewDidLoad()
方法并在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中的单元格数)
UIScrollView 中的 Swift UITableView(不滚动)