shouldShowMenuForRow没有被调用

时间:2017-02-05 14:57:26

标签: ios uitableview menu

第一次尝试实现菜单。我在UITableViewCell UITableView中使用自定义UITableViewController. TableView配置如下:

fileprivate configureTableView() {
    tableView.register(UINib(nibName: TransactionTableViewCell.nibName, bundle: nil), forCellReuseIdentifier: TransactionTableViewCell.identifier)
    tableView.rowHeight = UITableViewAutomaticDimension
    tableView.estimatedRowHeight = TransactionEntryTableViewCell.defaultHeight
}

我在下面创建了这样的单元格:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    switch indexPath.section {
    case 0:
        guard let cell = tableView.dequeueReusableCell(withIdentifier: TransactionTableViewCell.identifier, for: indexPath) as? TransactionTableViewCell else { DLog("ERROR getting TransactionTableViewCell"); return UITableViewCell() }
        let entry = entries[indexPath.row]
        cell.entry = entry
        return cell

    case 1:
        let cell = tableView.dequeueReusableCell(withIdentifier: "newTransactionCell", for: indexPath)
        cell.textLabel?.text = Strings.AddANewTransaction
        return cell

    default:
        assert(false)
        return UITableViewCell()
    }

菜单相关方法如下:

override func tableView(_ tableView: UITableView, shouldShowMenuForRowAt indexPath: IndexPath) -> Bool {
    print("shouldShowMenuForRowAt")
    return true
}

override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {
    print("canPerformAction")
    return action == MenuAction.duplicate.selector()
}

override func tableView(_ tableView: UITableView, performAction action: Selector, forRowAt indexPath: IndexPath, withSender sender: Any?) {
    print("action = \(action)")
}

一切似乎都运转良好;但是,长按表格时,方法shouldShowMenuForRowAt不会被调用。

我有一个工作正常的示例项目。但是,这不起作用。任何想法可能是什么原因?

2 个答案:

答案 0 :(得分:1)

您应该覆盖UITableViewDelegate方法,而不是NSObject

override func tableView(_ tableView: UITableView, canPerformAction action: Selector, forRowAt indexPath: IndexPath, withSender sender: Any?) -> Bool {
    return action == MenuAction.duplicate.selector()
}

答案 1 :(得分:1)

您的问题是您实施了

override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool

不是实际必需的方法:

override func tableView(_ tableView: UITableView, canPerformAction action: Selector, forRowAt indexPath: IndexPath, withSender sender: Any?) -> Bool

不客气,我在这个问题上浪费了一个小时!