【问题标题】:How to add Action for Static TableView Cell tap?如何为静态 TableView 单元格点击添加操作?
【发布时间】:2020-07-04 08:44:43
【问题描述】:

如何响应静态表格视图中的单元格点击?有没有办法将它与代码链接?我知道我可以使用动态的,但不能使用静态的吗?

didSelectRowAt 没有被调用

选择代码不起作用

class SettingsVC: UITableViewController, UITabBarControllerDelegate {

    // MARK: - View lifecycle
    override func viewDidLoad() {
        super.viewDidLoad()

        tableView.delegate = self
    }

    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        print("SELECTED") // not get called
    }
}

【问题讨论】:

  • 如果表格视图嵌入在UITableViewController 中,则只能将其设置为“静态”。因此,如果您不能将“静态”tableView 作为UIViewController 的子视图。您可以使用静态表视图(及其控制器)作为子视图控制器。通过实现didSelectRowAt,处理单元点击将照常完成
  • 它是一个 UITableViewController 但它不响应didSelectRowAt@DonMag

标签: ios swift iphone xcode uitableview


【解决方案1】:

您需要:

  1. 将 SettingsVC 更改为 UITableViewController 的子类。
  2. 让 SettingsVC 成为您的表格视图的委托,因为 tableView(_:didSelectRowAt:)UITableViewDelegate 的一个方法。

【讨论】:

  • didSelectRowAt 没有被调用。我遵从了代表
  • 很难说,因为您没有显示您声明 didSelectRowAt 的位置,以及您如何设置表的委托。
  • 请再次检查问题@GregdeJ
【解决方案2】:

这可以使用UIContainerView 中的静态表来完成。

这是情节提要设置:

以及它在运行时的样子:

当您使用 UIContainerView 时,它会创建一个 embed 转场...这将触发 prepare 调用,您可以在其中将 tableView 的委托设置为 self(如果需要)。

代码如下:

import UIKit

class EmbedTestViewController: UIViewController, UITableViewDelegate {

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

        // When using UIContainerView, prepare for segue will be called on load

        // un-comment this block to use SELF as the delegate
        //  for the tableView in the embedded tableViewController

        //if let vc = segue.destination as? MyStaticTableViewController {
        //  vc.tableView.delegate = self
        //}

    }

    // this will only be called if .delegate is set as shown above
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        print("didSelectRowAt called in \"Parent\" for indexPath:", indexPath)
    }

}

class MyStaticTableViewController: UITableViewController {

    // this will NOT be called if .delegate is set as the "parent" view controller
    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        print("didSelectRowAt called in \"Table View Controller\" for indexPath:", indexPath)
    }

}

注意EmbedTestViewControllerprepare func 中的cmets 和注释代码行。

如果您运行此 那些已注释的行,didSelectRowAt 将在 MyStaticTableViewController 类中调用。

如果您取消注释这些行,didSelectRowAt 将在 EmbedTestViewController 类中调用。


编辑

这是一个完整的例子:https://github.com/DonMag/ContainerTableView

【讨论】:

  • didSelectRowAt 不会在 MyStaticViewController 中被调用,如果我按照你说的完全复制它
  • @jsbeginnerNodeJS - 我在 GitHub 上放了一个示例项目:github.com/DonMag/ContainerTableView
  • 我发现我在我的 tableview 上禁用了选择。 segue 的工作是不必要的,因为你可以在 tablviewcontroller 中使用tablview.delegate = self
  • A UITableViewController 已经将其 tableView.delegate 设置为 self,因此不需要该行。为了将来参考,在提问时尽量清楚一点。您问“我如何响应静态表格视图中的单元格点击?” ...我似乎没有表明您的单元格甚至没有被选中开始与。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-25
  • 1970-01-01
相关资源
最近更新 更多