gpt4 book ai didi

ios - Swift:从 UITapGestureRecognizer 获取任意信息

转载 作者:行者123 更新时间:2023-11-28 07:01:31 25 4
gpt4 key购买 nike

我在 UITableView 的单元格中有一个图像列表。由于我不会(太多)进入的原因,我无法使用 didSelectRowAtIndexPath 来知道选择了哪个,因为我使用的是添加了自己的父 Gestures 的第三方模块,而且我无法设置 cancelsTouchesInView = false(这在技术上可以解决我的问题)。

在任何一种情况下,是否有一种方法可以将任意信息添加到 View 中,以便当我作为 sender 收到它时,我可以反省它。

例如:如果这是 HTML 和 JavaScript,您可以这样做。

$(myImage).data('foo', 'bar')
$(anotherImage.data('foo', 'thunk')

$('img').on('click', function () {
console.log($(this).data('foo')) // could be "foo" or "thunk"
})

在 swift

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
var cell = MyCustomTableViewCell()
cell.userInteractionEnabled = true
let tapped = UITapGestureRecognizer(target: self, action: Selector("myCallback:"))
cell.addGestureRecognizer(tapped)


// my imaginary world...
cell.foo = self.extraData[indexPath.row]

return cell
}

func myCallback(sender: AnyObject?) {
println(sender.foo)
}

显然,上面的方法行不通,但有没有办法实现我想要做的事情?

最佳答案

虽然我个人不建议使用那么多,但您可以使用 objc_setAssociatedObject如果您想在运行时将额外数据附加到对象。

这是一个关于如何在 Swift 中执行此操作的好资源:

http://nshipster.com/swift-objc-runtime/


或者,UIView 类有一个名为 tag 的属性,您可以在其中分配 indexPath.row 以获取稍后点击的单元格:

cell.tag = indexPath.row

顺便说一句,你最好不要在细胞上工作。相反,当您想要添加手势或另一个 subview 等时,请始终对其 contentView 属性进行操作。

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
...
cell.contentView.userInteractionEnabled = true

// Always remove previously added tap gestures because cells are reused
// as you scroll up and down so you'll end up having multiple
// recognizers on the same cell otherwise.
for recognizer in cell.contentView.gestureRecognizers {
cell.contentView.removeGestureRecognizer(recognizer)
}

cell.contentView.addGestureRecognizer(
UITapGestureRecognizer(target: self, action: "myCallback:"))

cell.contentView.tag = indexPath.row

...
return cell
}

在回调函数中获取单元格非常简单:

(假设您只有一个部分,因此 indexPath.section = 0)

func myCallback(sender: UIGestureRecognizer) {
let indexPath = NSIndexPath(forRow: sender.view.tag , inSection: 0)

if let cell = tableView.cellForRowAtIndexPath(indexPath) {
print("Cell \(cell) has been tapped.")
}
}

关于ios - Swift:从 UITapGestureRecognizer 获取任意信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31899777/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com