我正在尝试向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 ...,它就是调用动作方法甚至在应用程序开始运行之前立即显示。显然window
尚未加载,它会抛出以下警告
警告:尝试显示其视图不在窗口层次结构中!
我不明白为什么会这样。有人可以帮我解决这个问题吗?
谢谢
答案 0 :(得分:4)
您应该使用以下语法:
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()
执行一件事 - 在第一行中,您手动调用imgPressed()
函数,返回Void
。多数民众赞成=)
答案 1 :(得分:2)
更改您的手势线,如下所示如果swift 2.0或更低
let gest=UITapGestureRecognizer(target: self, action: Selector("imgPressed"));
如果您使用的是swift 2.2或更高版本
let gest=UITapGestureRecognizer(target: self, action: #selector(imgPressed));
希望这会对你有所帮助。