立即调用 UITapGestureRecognizer

UITapGestureRecognizer called immediately

我正在尝试将 UITapGestureRecognizer 添加到 imageview,如下所示

let gest=UITapGestureRecognizer(target: self, action: Selector(imgPressed()));
gest.delegate=self
thalaImg.addGestureRecognizer(gest)

这里是 imgPressed 函数:

func imgPressed()
{ 
    let alert=UIAlertController(title: "Img", message: "img pressed", preferredStyle: .Alert) 
    let okButton=UIAlertAction(title: "Ok", style: .Default, handler: nil) 
    alert.addAction(okButton) 
    presentViewController(alert, animated: true, completion: nil) 
}

我在 viewdidload 中添加了 3 行代码,添加了一个断点和 运行 我观察到 application.What 一旦编译器到达第一行,即让 gest。 ..,它甚至在应用程序启动之前立即调用操作方法 running.Since 显然 window 尚未加载,它会抛出以下警告

Warning: Attempt to present on whose view is not in the window hierarchy!

我不明白为什么会这样。有人可以帮我解决这个问题吗?

谢谢

您应该使用以下语法:

let gest = UITapGestureRecognizer(target: self, action: #selector(imgPressed))

请注意,Selector 可以接受初始类型 Void 以及 String。正确的旧式 Selector 初始化如下所示:

let action: Selector = Selector("imgPressed")

现在您可以检查一下,如果您尝试将新样式与旧样式结合使用,您将得到编译错误:

let action = Selector(imgPressed) // Error!

有趣的是,您可能会尝试通过附加括号来解决此错误,之后您将不会再有任何错误!但这完全没有用。看下面3行代码,它们是等价的

let action = Selector(imgPressed())
let action = Selector(Void())
let action = Selector()

exept 一件事 - 在第一行中,您调用了 imgPressed() 函数,返回了 Void,由您亲手执行。就是这样 =)

如果 swift 2.0 或更少

,请按照以下方式更改您的手势线
let gest=UITapGestureRecognizer(target: self, action: Selector("imgPressed"));

如果您使用 swift 2.2 或更高版本

let gest=UITapGestureRecognizer(target: self, action: #selector(imgPressed));

希望对您有所帮助。