表单内的 TableView 没有正确显示 Swift

Posted

技术标签:

【中文标题】表单内的 TableView 没有正确显示 Swift【英文标题】:TableView inside Form Sheet not showing properly Swift 【发布时间】:2020-02-11 17:33:01 【问题描述】:

我正在尝试在表单中显示一个 TableView。这在 iPhone 上完全可以正常工作。但是,当我出于某种原因在 iPad 上对其进行测试时,视图比表单大。 这是我正在谈论的图像:

iPad

如您所见,文本在框架中并非全部可见。全文是“这没有完全显示”

这是它应该看起来的样子(忽略黑暗模式)

iPhone

在 MainController() 中,我通过在 ViewDidLoad() 中显示了这个页面 IntroController()

let navController = UINavigationController(rootViewController: IntroController())
present(navController, animated: true, completion: nil)

在 IntroController() 中这是代码。

import UIKit

var tableview: UITableView!

class IntroController: UIViewController, UITableViewDelegate, UITableViewDataSource 
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        return 1
    

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
        let cell = tableView.dequeueReusableCell(withIdentifier: TableCell.reuseIdentifier()) as! TableCell
        cell.label.text = "Amount"
        cell.typeLabel.text = "THIS IS NOT SHOWING FULLY"
        cell.selectionStyle = .none
        cell.accessoryType = .none
        return cell
    

    func numberOfSections(in tableView: UITableView) -> Int 
        return 1
    

    override func viewDidLoad() 
        super.viewDidLoad()

        tableview = UITableView(frame: CGRect(x: 0, y: 0, width: view.frame.width, height: view.frame.height), style: .grouped)
        view.addSubview(tableview)

        tableview.register(UINib(nibName: TableCell.nibName(), bundle: nil), forCellReuseIdentifier: TableCell.reuseIdentifier())

        tableview.delegate = self
        tableview.dataSource = self

    


有谁知道为什么会发生这种情况以及如何解决?

谢谢!

【问题讨论】:

显示你的单元格类 @jawadAli 不相关。看看 Sweeper 的回答。 太棒了..很高兴知道你得到了答案 【参考方案1】:

不将table view添加到VC的view作为子视图,直接设置为view

view = tableview

或者,直接使用UITableViewController。我强烈建议您选择这种方法。

class IntroController: UITableViewController 

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        return 1
    

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
        ...
    

    override func numberOfSections(in tableView: UITableView) -> Int 
        return 1
    

    override func viewDidLoad() 
        super.viewDidLoad()
        tableView.register(UINib(nibName: TableCell.nibName(), bundle: nil), forCellReuseIdentifier: TableCell.reuseIdentifier())
    


我不确定是什么原因造成的,但如果我猜的话,可能是因为 view.frame 出于某种原因,在 viewDidLoad 时(尚未)设置为 VC 的内容大小的矩形叫做。如果您将添加表格视图作为view 的子视图的代码移动到viewDidLayoutSubviews,那么它也可以工作:

override func viewDidLayoutSubviews() 
    if view.subviews.count < 1 
        tableview = UITableView(frame: CGRect(x: 0, y: 0, width: view.bounds.width, height: view.bounds.height), style: .grouped)
        tableview.register(UINib(nibName: TableCell.nibName(), bundle: nil), forCellReuseIdentifier: TableCell.reuseIdentifier())
        view.addSubview(tableview)

        tableview.delegate = self
        tableview.dataSource = self
    

【讨论】:

将它放在 viewDidLayoutSubviews() 正如你提到的那样修复它!谢谢! @ItsMoShehab 是否有您不能使用UITableViewController 或将表格视图设置为view 的原因?这两种方法都不那么“脆弱”。 以上课程仅用于演示。我没有将其设置为 UITableViewController,因为在“let cell = tableView.dequeueReusableCell(withIdentifier: TableCell.reuseIdentifier()) as! TableCell 旁边出现错误“线程 1:致命错误:打开可选值时意外发现 nil” ”。我没有任何理由不设置 view = tableView 除了我不确定设置后它是如何工作的看法?我不想让自己更加困惑,所以我只是让它们分开 @ItsMoShehab 我不确定是什么导致了意外发现的 nil 错误。你还在用全局tableview吗?你现在应该删除它。在表 VC 的tableView(大写V)上注册单元格。如果您想使用view = tableView,只需将addSubview 调用替换为该行即可。 @ItsMoShehab 是的

以上是关于表单内的 TableView 没有正确显示 Swift的主要内容,如果未能解决你的问题,请参考以下文章

viewController 内的 tableview 中没有显示任何信息

在 TableView 中实现表单

当tableview样式在iOS中分组时,为啥节中的标题视图没有正确显示,目标c

Swift 4 TableView Cell 不显示正确的图像

在 tableview 内的 collectionview 上显示图像

Swift:如何在 TableView 内的 CollectionView 中显示解析的 JSON 数据?