首页 > 解决方案 > UITableViewController 在初始化时没有选择单元格

问题描述

我有以下子类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)
}

标签: iosswiftuitableviewuikit

解决方案


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

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

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

在此处输入图像描述

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

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

self.clearsSelectionOnViewWillAppear = false

推荐阅读