UITableViewController 在初始化时没有选择单元格

Posted

技术标签:

【中文标题】UITableViewController 在初始化时没有选择单元格【英文标题】:UITableViewController doesn't select a cell on initialization 【发布时间】:2019-05-28 12:04:06 【问题描述】:

我有以下UITableViewController 的子类:

final public class ILoveAppleSelectorTableViewController: UITableViewController 
    public weak var delegate: ILoveAppleSelectorTableViewControllerDelegate?
    public var data = [ILoveAppleGroupModel]()

    convenience init() 
        self.init(style: .plain)
    

    convenience init(data: [ILoveAppleGroupModel]) 
        self.init(style: .plain)
        self.data = data
    

    override public func viewDidLoad() 
        super.viewDidLoad()
        title = "Select APple Product"
        tableView.registerCellClass(CheckmarkTableViewCell.self)
        tableView.allowsSelection = true
        tableView.allowsMultipleSelection = false
    

    // MARK: - Selection

    public func selectItem(at indexPath: IndexPath) 
        tableView.selectRow(at: indexPath, animated: false, scrollPosition: .none)
    

    // MARK: - Table view data source

    override public func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        return data.count
    

    override public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
        let cell: CheckmarkTableViewCell = tableView.dequeueCell(for: indexPath)
        let item = data[indexPath.row]
        cell.textLabel?.text = item.material_group_name
        return cell
    

    override public func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 
        let selectedappleProduct = data[indexPath.row]
        delegate?.ILoveAppleSelector(controller: self, didSelect: selectedappleProduct)
    

我创建它的一个实例并调用selectItem 方法:

let data = Array(appleProducts)
let selector = AppleProductSelector(data: data)
selector.selectItem(at: IndexPath(indexes: [0, 0]))
navigationController?.pushViewController(selector, animated: true)

我在调试器中检查selectItem 方法被成功调用,但是没有被选中。

如果我改为在 viewWillAppear 上选择一个项目,一切都会按预期工作,并且该项目显示为选中状态:

public override func viewWillAppear(_ animated: Bool) 
    super.viewWillAppear(animated)
    selectItem(at: selectedIndexPath)

【问题讨论】:

您想在表格视图首次出现时显示选中行的复选标记吗? 【参考方案1】:

默认情况下,表格视图控制器会在表格视图显示时清除选择。

您正在实例化您的类,然后“选择”一行,然后将 VC 推入堆栈。当它出现时,它会清除选择。

在 IB / Storyboard 中,它由一个复选框控制:

(取消选中该框以防止选择清除)

在代码中,您可以将其添加到您的 init func 中(或者可能在 viewDidLoad() 中):

self.clearsSelectionOnViewWillAppear = false

【讨论】:

以上是关于UITableViewController 在初始化时没有选择单元格的主要内容,如果未能解决你的问题,请参考以下文章

iOS 15 上 UITableViewController 的便捷初始化崩溃

使用情节提要时未调用 UITableViewController 覆盖初始化函数

未调用 UITableViewController 初始化方法

iPhone - 两个不同的自定义单元格,具有不同的设计,在同一个 UITableViewController - 单元格保持初始大小

对于从 IB 加载的 UItableViewController,非视图相关的初始化代码放在哪里

如何在 Swift 中继承 UITableViewController