所以我在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)我将手势对象拖动到文件所有者,以便手势在自定义类中“连接到代码”。
这些都是我的步骤,正如我所说,我怀疑某个地方存在委托问题。
答案 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文件所有者的类设置为自定义单元格类。
一开始你是错的。 UITableViewCell
是UIView
的子类。因此,您应该将View设置为自定义单元格类,而不是文件的所有者。该文件的所有者应为NSObject。
如果文件的所有者是UIViewController
的子类,则只能将文件的所有者设置为自定义类。