立即调用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
可以接受初始typesVoid
和String
。 正确的旧样式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));
希望这会帮助你。