立即调用UITapGestureRecognizer

我正在试图添加一个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行代码,添加了一个断点并运行了应用程序。我观察到的是,一旦编译器进入第一行,即let gest …,它即使在应用程序启动之前立即调用action方法运行。由于显然window尚未加载,它会抛出下面的警告

警告:尝试呈现其视图不在窗口层次结构中的视图!

我不明白为什么会发生这种情况。有人可以帮我解决这个问题吗?

谢谢

你应该使用下面的语法:

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

请注意, Selector可以接受初始typesVoidString 。 正确的旧样式Selector初始化如下所示:

 let action: Selector = Selector("imgPressed") 

现在你可以检查一下,如果你尝试将新风格和旧风格结合起来,你会得到编译错误:

 let action = Selector(imgPressed) // Error! 

有趣的是,你可能会尝试通过追加护腕来解决这个错误,之后你将不会有任何错误! 但是这完全没用。 看下面的3行代码,它们是等价的

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

免除一件事 – 在第一行中,你调用imgPressed()函数,返回Void ,由你的手。 那就是=)

改变你的手势线如下, 如果迅速2.0或更less

 let gest=UITapGestureRecognizer(target: self, action: Selector("imgPressed")); 

如果你使用的是swift 2.2或更高版本

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

希望这会帮助你。