未调用 cellForRowAt 但正在调用 numberOfSection 和 numberOfRowsInSection

Posted

技术标签:

【中文标题】未调用 cellForRowAt 但正在调用 numberOfSection 和 numberOfRowsInSection【英文标题】:cellForRowAt not being called But numberOfSection and numberOfRowsInSection is being called 【发布时间】:2017-12-26 10:06:01 【问题描述】:

我的代码:

//Adding Destination VC as subview in my current view's view container
let storyboard = UIStoryboard(name: "Main", bundle: nil)
        let viewController = storyboard.instantiateViewController(withIdentifier: "DestinationViewControllerID")
         containerView.addSubview(viewController.view)
        viewController.didMove(toParentViewController: self)

//Now implementing Table view in the destination vc

class DestinationViewController: 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.

        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)
        tableView.dataSource = self
        tableView.delegate = self
        tableView.backgroundColor = UIColor.blue

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

        view.addSubview(tableView)

        tableView.reloadData()
    

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 4//tableData.count
    

如果我将目标 viewController 设置为故事板中的初始 vc,则一切正常。但如果在容器视图中添加为子视图,则不会调用 cellForRowAt 方法,但会调用 numberOfSection 和 numberOfRowsInSection。

有人有解决办法吗?

【问题讨论】:

您需要将 UITableView 添加到您的 UIViewController.View 什么是swift版本? 在添加到子视图之前重新加载表视图 看起来您在第一段代码中缺少self.addChildViewController(viewController) - 请参阅here。 self.addChildViewController 对我不起作用。我正在使用 viewContainer 将其他视图控制器加载到第一个视图控制器中。 【参考方案1】:

在子查看之前添加 self.addChildViewController(viewController)

 let storyboard = UIStoryboard(name: "Main", bundle: nil)
 let viewController = storyboard.instantiateViewController(withIdentifier: "DestinationViewControllerID")

 self.addChildViewController(viewController)
 containerView.addSubview(viewController.view)
 viewController.didMove(toParentViewController: self)

【讨论】:

【参考方案2】:

确保在UITableView 上设置了约束。如果是这样,请尝试手动设置UITableViewCell 的高度。

【讨论】:

这不会是问题,因为 UITableView 的大小不会影响被调用的数据源方法,也不会影响 UITableViewCell 的高度。【参考方案3】:

首先,您需要在情节提要中有一个表格视图。创建 tableView 后,您可以通过以下方式以编程方式对其进行子查看:

self.view.addSubview(tableView)

或在故事板中添加 tableView 并像这样创建一个 IBOutlet:

@IBOutlet weak var tableView: UITableView!

其次,您还没有初始化您的单元格,您只是将一个先前创建的单元格出列(在您的情况下从未创建过)。你的代码应该是这样的:

var cell = tableView.dequeueReusableCell(withIdentifier: "my", for: indexPath) as UITableViewCell?
if cell == nil  
  cell = UITableViewCell(style: UITableViewCellStyle.default, reuseIdentifier: "my")

【讨论】:

【参考方案4】:

复查是否注册了reusableidentifier

tableView.dequeueReusableCell(withIdentifier: "my", for: indexPath)

【讨论】:

删除此行。 tableView.register(UITableViewCell.self, forCellReuseIdentifier: "my") 并尝试 let cell = UITableViewCell() 这不可能是问题,因为 cellForRowAtIndex 本身没有被调用,即使没有注册单元也应该被调用。 如果 numberofrow 被调用意味着 cellforrow 肯定会调用。并且还使用 Numberofsection 委托并返回 1

以上是关于未调用 cellForRowAt 但正在调用 numberOfSection 和 numberOfRowsInSection的主要内容,如果未能解决你的问题,请参考以下文章

未使用 reloadData() 方法调用 cellForRowAt indexPath

为啥 UITableViewCells cellForRowAt 方法不调用?

如何从 cellForRowAt 调用 draw(_ rect: CGRect) 在自定义 tableview 上绘图?

更改 tableview 高度后 CellForRowAt 不调用

FusedLocationClient 未调用 onLocationResult

UITableView,cellForRowAt indexPath 没有被调用