UITapGestureRecognizer立即调用

时间:2016-06-21 11:42:45

标签: ios xcode swift uigesturerecognizer 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 ...,它就是调用动作方法甚至在应用程序开始运行之前立即显示。显然window尚未加载,它会抛出以下警告

  

警告:尝试显示其视图不在窗口层次结构中!

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

谢谢

2 个答案:

答案 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));

希望这会对你有所帮助。