【问题标题】:didSelectRowAtIndexPath only working on long press if embedded in container view [duplicate]如果嵌入在容器视图中,didSelectRowAtIndexPath 仅在长按时有效[重复]
【发布时间】:2016-06-11 14:14:07
【问题描述】:

我正在为一个应用程序创建一个原型,该应用程序在两个不同的场景中使用完全相同的 UITableViewController 类文件。

  • 第一个场景用于显示新创建的“项目”项的列表。在这种情况下,我在 StoryBoard 中使用常规的表视图控制器。
  • 第二个场景允许用户在不同的视图中从现有的“项目”项目中进行选择。在这种情况下,我有一个 常规 视图控制器,它有一个 容器视图。容器视图使用嵌入式 tableview 控制器来显示可选列表。

明确地说,这是我的第二种情况的样子:

请记住,两者都使用确切相同的类文件。 第一个场景完美运行,而第二个场景只长按调用didSelectRowAtIndexPath,点击根本不起作用。

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    print("fires") // scenario 2 does not fire until long press
    if selectable {
        guard let cell = tableView.cellForRowAtIndexPath(indexPath) else { return }
        cell.accessoryType = (cell.accessoryType == .Checkmark) ? .None : .Checkmark
    }
}

我的问题

将我的表格视图控制器嵌入到容器视图中,我怎样才能让 didSelectRowAtIndexPath 在点击而不是长按时触发?

【问题讨论】:

    标签: swift touch didselectrowatindexpath uicontainerview


    【解决方案1】:

    我有一个类似的问题,这是由于容器视图没有实现触摸方法并通过调用 super 将它们传递到链上:

        override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
        super.touchesBegan(touches, withEvent: event)
    

    我在容器中没有任何触摸功能,但仍然需要进行调用并将其向上传递,以便我的表格视图对其进行操作。

    【讨论】:

    • 我不完全确定我会在哪里添加这个。我是否为我的容器视图对象创建一个新类?还是将其添加到我的表视图控制器中?我想的是前者。
    • 对 - 子类化您的容器视图。
    • 我创建了 UIView 的子类并将其添加到界面构建器中的容器视图中。 touchesBegan 函数不会触发。我也试过扩展 UIView 还是不行。
    • 触摸事件必须通过super沿视图层次传递。如果您的容器视图确实是 UIView 的子类,则只需在您的容器视图中实现触摸处理程序。如果您的原始容器视图不是 UIView 或者在您的表格视图和顶部视图(接收您的触摸事件)之间有任何其他视图,您需要重构。确定触摸事件在哪里丢失的一种方法是从上到下开始实现触摸处理程序并设置断点,以便您可以观察到您的触摸正在被处理。
    猜你喜欢
    • 2014-06-15
    • 2017-02-15
    • 1970-01-01
    • 1970-01-01
    • 2017-12-13
    • 1970-01-01
    • 2012-07-24
    • 1970-01-01
    • 2015-04-16
    相关资源
    最近更新 更多