3

Я пытаюсь добавить UITapGestureRecognizer к imageview, как показано нижеUITapGestureRecognizer называют сразу

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

А вот imgPressed функция: Я добавил 3 строки кода в viewdidload

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) 
} 

, добавила точку останова и запустила приложение. Что я заметил, так это то, что как только компилятор дойдет до первой строки, т. е. дайте gest ..., он вызывает метод действия немедленно даже до запуска приложения. Поскольку очевидно window еще для загрузки, он бросает ниже предупреждение

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

Я не понимаю, почему это происходит .Can кто-то пожалуйста, помогите мне с этим вопросом?

Спасибо

+0

«функ imgPressed() { пусть встревоженной = UIAlertController (название: "Img", сообщение: "IMG нажата", preferredStyle: .Alert) пусть = UIAlertAction OK для подтверждения (название: "Ok", стиль:. по умолчанию обработчика: ноль) alert.addAction (OK для подтверждения) presentViewController (предупреждение, анимированное: правда, завершение: ноль) } –

+0

Хорошо удалить() после того, как imgPressed method.And в двойных кавычках "imgPressed". – Pushpa

+0

Вы работаете над тем, какая быстрая версия означает swift 2.0 или swift 3.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, своими руками. То он =)

2

Изменить жест линию как следующий если скоры 2,0 или менее

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

если вы используете быстрые 2,2 или больше, чем это

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

Надеется, что это помочь тебе.

+0

Ну, я изменил ** Селектор (imgPressed()) ** на ** # селектор (imgPressed) **. Проблема с вызовом метода немедленно устранена, но теперь метод не вызывается, когда я нажимаю на изображение –

+0

@koushikv, убедитесь, что для свойства 'userInteractionEnabled' в вашем' UIImageView' установлено значение 'true'. Добавьте 'thalaImg.userInteractionEnabled = true' в' viewDidLoad' –

+0

Вам нужно установить userInterActionEnabled в true –