Swift - 在自定义单元格中添加长按手势识别器

时间:2015-01-05 21:13:23

标签: uitableview swift uigesturerecognizer sigabrt

所以我在tableview中为我的单元格提供了一个自定义单元格类和一个xib文件,我想在自定义单元格中添加一个长按识别。

我尝试将长按识别器拖放到xib文件中的单元格中,使文件的所有者成为手势的委托,然后将其从文档大纲“拖放”添加到自定义类swift文件中。我还将UIGestureRecognizerDelegate添加到自定义单元类中。

现在当我运行应用程序时,我得到一个线程1:发出SIGABRT信号错误,说实话,我不明白为什么。这是我第一次使用手势识别器,如果有明显的错误或我应该做的事情,那就很抱歉。

有关如何继续的任何建议将不胜感激。

编辑:正如Logan建议我解除所有已完成的工作并遵循他的步骤。我的自定义类中的代码现在看起来像这样:

@IBAction func pressed(sender: AnyObject) {

    func handleLongPress(sender: UILongPressGestureRecognizer) {
        if sender.state == .Began {
            println("Received longPress!")
        }
    }
}

但我仍然得到错误。我注意到的是,如果我只是将手势添加到xib文件并运行应用程序,我就会收到错误消息。我不知道是不是因为我还没有将它连接到自定义类文件,但我想我只是把它扔到那里。

编辑2:将我的代码更改为:

@IBAction func pressed(sender: UILongPressGestureRecognizer) {
    if sender.state == .Began {
        println("Received longPress!")
    }
}

我仍然得到错误。

我不知道我是否说清楚,但我甚至无法加载屏幕,它只是立即崩溃。所以我认为这是一个委托/参考问题,这是我的参考文献:

1)我将xib文件所有者的类设置为自定义单元类。 2)我在手机上拖动手势识别器。 3)我将手势对象拖到文件所有者,以便文件所有者是其委托。 4)我在自定义类中添加了上面的代码。 5)我将手势对象拖动到文件所有者,以便手势在自定义类中“连接到代码”。

这些都是我的步骤,正如我所说,我怀疑某个地方存在委托问题。

2 个答案:

答案 0 :(得分:3)

我有类似的问题。问题是,当您向xib文件添加手势识别器时,有多个对象(您的tableview单元格和手势识别器),tableview数据源无法处理此问题。该错误正确描述了问题。我将tableview单元格移动到主故事板,而不是将其保存在单独的xib文件中以解决此问题。

原因:'无效的nib注册标识符(CELL) - nib必须只包含一个顶级对象,该对象必须是UITableViewCell实例'

您问题的另一个解决方案是在以下代码中创建手势识别器:

  

self.tap = [[UITapGestureRecognizer alloc] initWithTarget:self   动作:@selector(tapFired:)];

在自定义表格视图单元格的awakeFromNib中。

我只是认为基本问题是您无法在表格视图单元格xib中添加手势识别器,然后让tableview数据源加载单元格。

答案 1 :(得分:0)

1)我将xib文件所有者的类设置为自定义单元格类。

一开始你是错的。 UITableViewCellUIView的子类。因此,您应该将View设置为自定义单元格类,而不是文件的所有者。该文件的所有者应为NSObject。

如果文件的所有者是UIViewController的子类,则只能将文件的所有者设置为自定义类。