【发布时间】:2016-05-15 12:11:19
【问题描述】:
我正在尝试向我的按钮添加自定义行为。如果单击一次 - 执行一项操作。如果单击两次,则会执行另一次。
我看到such a solution in this answer 并且尝试了所有可能的组合:
clickOnce.shouldBeRequiredToFailByGestureRecognizer(clickTwice)
clickTwice.shouldBeRequiredToFailByGestureRecognizer(clickOnce)
clickOnce.shouldRequireFailureOfGestureRecognizer(clickTwice)
clickTwice.shouldRequireFailureOfGestureRecognizer(clickOnce)
clickOnce.canPreventGestureRecognizer(clickTwice)
clickOnce.canBePreventedByGestureRecognizer(clickTwice)
clickTwice.canPreventGestureRecognizer(clickOnce)
clickTwice.canBePreventedByGestureRecognizer(clickOnce)
但对我没有任何帮助。
这是完整的代码:
import Cocoa
class ViewController: NSViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
let buttonTestOne = NSButton(frame: CGRect(x: 500, y: 500, width: 100, height: 500))
let clickOnceForTestOne = NSClickGestureRecognizer(target: buttonTestOne, action: #selector(ViewController.clickOneTime(_:)))
clickOnceForTestOne.numberOfClicksRequired = 1
buttonTestOne.addGestureRecognizer(clickOnceForTestOne)
self.view.addSubview(buttonTestOne)
let arrTestButtons = ["One", "Two", "Three"]
var x = 0
var y = 0
for item in arrTestButtons{
let buttonNew = NSButton(frame: CGRect(x: x, y: y, width: 100, height: 100))
x = x + 120
y = y + 120
buttonNew.attributedTitle = NSAttributedString(string: item)
let clickOnce = NSClickGestureRecognizer(target: self, action: #selector(ViewController.clickOneTime(_:)))
clickOnce.numberOfClicksRequired = 1
buttonNew.addGestureRecognizer(clickOnce)
let clickTwice = NSClickGestureRecognizer(target: self, action: #selector(ViewController.clickTwoTimes(_:)))
clickTwice.numberOfClicksRequired = 2
buttonNew.addGestureRecognizer(clickTwice)
clickOnce.shouldBeRequiredToFailByGestureRecognizer(clickTwice)
clickTwice.shouldBeRequiredToFailByGestureRecognizer(clickOnce)
clickOnce.shouldRequireFailureOfGestureRecognizer(clickTwice)
clickTwice.shouldRequireFailureOfGestureRecognizer(clickOnce)
clickOnce.canPreventGestureRecognizer(clickTwice)
clickOnce.canBePreventedByGestureRecognizer(clickTwice)
clickTwice.canPreventGestureRecognizer(clickOnce)
clickTwice.canBePreventedByGestureRecognizer(clickOnce)
self.view.addSubview(buttonNew)
}
}
func clickOneTime(g:NSClickGestureRecognizer){
if g.state == .Ended {
Swift.print("single click")
}
}
func clickTwoTimes(g: NSClickGestureRecognizer){
if g.state == .Ended {
Swift.print("DOUBLE CLICK!")
}
}
override var representedObject: AnyObject? {
didSet {
// Update the view, if already loaded.
}
}
}
我做错了什么?我想这个错误一定很简单,我要么打错地方了,要么有点类似,但我看不懂。
这是日志文件,所有组合都相同:
点击一次:
single click
如预期的那样
点击了两次:
single click
DOUBLE CLICK!
同时启动单击和双击。
我已阅读文档。而且我已经尝试了所有组合,因为找不到解决方案。
我也尝试过使用日志。所以Swift.print(clickOnce.shouldBeRequiredToFailByGestureRecognizer(clickTwice)) 和其中之一,但它给了我false。
【问题讨论】:
-
您不能简单地将各种代码行混在一起并期望代码按预期运行。阅读您调用的每个方法的文档,并尝试找出哪个手势识别器可以以何种方式影响另一个。
-
您提到的示例适用于 iOS,而不是 OS X,因此用鼠标单击两次可能与用手指在设备上双击具有相同的效果。此外,“没有什么对我有用”没有说明它是如何不起作用的,你应该在你的问题中解释这一点。
-
@luk2302 我没有将它们全部混合,我只是尝试了所有组合并发布了类似的代码
-
我怀疑你尝试了所有这些,有 2^8,也就是 256 种组合。请接受我的建议并阅读文档。
-
@luk2302 我已经阅读了文档,好的,我还没有尝试过所有 256 个组合,但是我尝试了文档中似乎最合乎逻辑的方法。一个接一个,一气呵成。至少如果有一种组合可以发挥作用,它就会出现。