iOS: проблема с касанием жеста при просмотре изображения

Я медленно работаю над разработкой Apple для обучения Swift, и я продолжаю сталкиваться с проблемой с моим жестом касания. Я воссоздал номера проекта несколько раз с тем же результатом.

Я добавляю жест касания к изображению, и это должно открыть библиотеку фотографий с моего компьютера. Ничего не произошло.

Когда я загружаю и запускаю образец файла из Apple, все работает. Когда я копирую и вставляю код из Apple в свой, снова ничего не происходит. Я прошел через все, что мог, но чувствую, что мне чего-то не хватает.

Вот мой код. Код Apple ниже:

import UIKit

class ViewController: UIViewController, UITextFieldDelegate, UIImagePickerControllerDelegate, UINavigationControllerDelegate {

    // MARK: Properties
    @IBOutlet weak var nameTextField: UITextField!
    @IBOutlet weak var mealNameLabel: UILabel!
    @IBOutlet weak var photoImageView: UIImageView!

    override func viewDidLoad() {
        super.viewDidLoad()

        // handle the text fields user input through delegate callbacks
        nameTextField.delegate = self

    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    // MARK: UITextFieldDelegate
    func textFieldShouldReturn(textField: UITextField) -> Bool {
       // Hide the Keyboard
        textField.resignFirstResponder()
        return true

    }
    func textFieldDidEndEditing(textField: UITextField) {
        mealNameLabel.text = textField.text
    }

    // MARK: UIImagePickerControllerDelegate

    func imagePickerControllerDidCancel(picker: UIImagePickerController) {
        // dismiss the picker if user cancels
        dismissViewControllerAnimated(true, completion: nil)
    }

    func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {
        // The info dictionary contains multiple representations of the image, and this uses the original.
        let selectedImage = info[UIImagePickerControllerOriginalImage] as! UIImage

        // Set the photoviewimage to be the selected image
        photoImageView.image = selectedImage

        // Dismiss the picker
        dismissViewControllerAnimated(true, completion: nil)
    }

    // MARK: Actions

    @IBAction func selectImageFromPhotoLibrary(sender: UITapGestureRecognizer) {
        // Hide the Keyboard
        nameTextField.resignFirstResponder()

        // UIImagePickerController is a view controller that lets a user pick media from their photo library.
        let imagePickerController = UIImagePickerController()

        // Only Allow pictures to be selected and not taken
        imagePickerController.sourceType = .PhotoLibrary

        // make sure the viewcontroller is notified when the user selects an image
        imagePickerController.delegate = self

        presentViewController(imagePickerController, animated: true, completion: nil)

    }

    @IBAction func setDefaultLabelText(sender: UIButton) {
        mealNameLabel.text = "Default Text"
    }

}

Вот код Apple:

import UIKit

class ViewController: UIViewController, UITextFieldDelegate, UIImagePickerControllerDelegate, UINavigationControllerDelegate {
    // MARK: Properties

    @IBOutlet weak var nameTextField: UITextField!
    @IBOutlet weak var mealNameLabel: UILabel!
    @IBOutlet weak var photoImageView: UIImageView!

    override func viewDidLoad() {
        super.viewDidLoad()

        // Handle the text field’s user input through delegate callbacks.
        nameTextField.delegate = self
    }

    // MARK: UITextFieldDelegate

    func textFieldShouldReturn(textField: UITextField) -> Bool {
        // Hide the keyboard.
        textField.resignFirstResponder()
       return true
    }

    func textFieldDidEndEditing(textField: UITextField) {
        mealNameLabel.text = textField.text
    }

    // MARK: UIImagePickerControllerDelegate
    func imagePickerControllerDidCancel(picker: UIImagePickerController) {
        // Dismiss the picker if the user canceled.
        dismissViewControllerAnimated(true, completion: nil)
    }

    func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {
        // The info dictionary contains multiple representations of the image, and this uses the original.
        let selectedImage = info[UIImagePickerControllerOriginalImage] as! UIImage

        // Set photoImageView to display the selected image.
        photoImageView.image = selectedImage

        // Dismiss the picker.
        dismissViewControllerAnimated(true, completion: nil)
    }

    // MARK: Actions
    @IBAction func selectImageFromPhotoLibrary(sender: UITapGestureRecognizer) {
        // Hide the keyboard.
        nameTextField.resignFirstResponder()

        // UIImagePickerController is a view controller that lets a user pick media from their photo library.
        let imagePickerController = UIImagePickerController()

        // Only allow photos to be picked, not taken.
        imagePickerController.sourceType = .PhotoLibrary

        // Make sure ViewController is notified when the user picks an image.
        imagePickerController.delegate = self

        presentViewController(imagePickerController, animated: true, completion: nil)
    }

    @IBAction func setDefaultLabelText(sender: UIButton) {
        mealNameLabel.text = "Default Text"
    }

}

Рабочий код от Anbu

import UIKit

class ViewController: UIViewController, UITextFieldDelegate, UIImagePickerControllerDelegate, UINavigationControllerDelegate  {


    // MARK: Properties
    @IBOutlet weak var nameTextField: UITextField!
    @IBOutlet weak var mealNameLabel: UILabel!
    @IBOutlet weak var photoImageView: UIImageView!



    override func viewDidLoad() {
        let tapgesture = UITapGestureRecognizer(target: self, action: Selector("imagepressed"))
        photoImageView.userInteractionEnabled = true
        photoImageView.addGestureRecognizer(tapgesture)

        super.viewDidLoad()

        // handle the text fields user input through delegate callbacks
        nameTextField.delegate = self

    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    // MARK: UITextFieldDelegate
    func textFieldShouldReturn(textField: UITextField) -> Bool {
       // Hide the Keyboard
        textField.resignFirstResponder()
        return true

    }
    func textFieldDidEndEditing(textField: UITextField) {
        mealNameLabel.text = textField.text
    }

    // MARK: UIImagePickerControllerDelegate

    func imagePickerControllerDidCancel(picker: UIImagePickerController) {
        // dismiss the picker if user cancels
        dismissViewControllerAnimated(true, completion: nil)
    }

    func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {
        // The info dictionary contains multiple representations of the image, and this uses the original.
        let selectedImage = info[UIImagePickerControllerOriginalImage] as! UIImage

        // Set the photoviewimage to be the selected image
        photoImageView.image = selectedImage

        // Dismiss the picker
        dismissViewControllerAnimated(true, completion: nil)
    }

    // MARK: Actions


    func imagepressed () {
        nameTextField.resignFirstResponder()

        // UIImagePickerController is a view controller that lets a user pick media from their photo library.
        let imagePickerController = UIImagePickerController()

        // Only Allow pictures to be selected and not taken
        imagePickerController.sourceType = .PhotoLibrary

        // make sure the viewcontroller is notified when the user selects an image
        imagePickerController.delegate = self

        presentViewController(imagePickerController, animated: true, completion: nil)
    }



/*    @IBAction func selectImageFromPhotoLibrary(sender: UITapGestureRecognizer) {
        let tapgesture = UITapGestureRecognizer(target: self, action: Selector("imagepressed"))
        photoImageView.userInteractionEnabled = true
        photoImageView.addGestureRecognizer(tapgesture)

        // Hide the Keyboard
        nameTextField.resignFirstResponder()

        // UIImagePickerController is a view controller that lets a user pick media from their photo library.
        let imagePickerController = UIImagePickerController()

        // Only Allow pictures to be selected and not taken
        imagePickerController.sourceType = .PhotoLibrary

        // make sure the viewcontroller is notified when the user selects an image
        imagePickerController.delegate = self

        presentViewController(imagePickerController, animated: true, completion: nil)

    }
   */

    @IBAction func setDefaultLabelText(sender: UIButton) {
        mealNameLabel.text = "Default Text"
    }

}

person Parker O'Connel    schedule 25.01.2016    source источник
comment
Где находится распознаватель тап-жестов?   -  person matt    schedule 25.01.2016
comment
Вы добавили распознаватель касаний в раскадровку/XIB для вашего контроллера просмотра? Если вы не добавили распознаватель жестов касания в раскадровку/xib, а затем подключили метод действия к selectImageFromPhotoLibrary.   -  person iamyogish    schedule 25.01.2016
comment
жест касания был добавлен в раскадровку на ImageView, а затем подключен с помощью перетаскивания под //Mark: Actions with the UITapGesture   -  person Parker O'Connel    schedule 25.01.2016


Ответы (4)


нравится

Причина в том, что по умолчанию UIImageview userInteraction является ложным, поэтому вам нужно включить вручную

Шаг 1

let tapGesture = UITapGestureRecognizer(target:self, action:Selector("imagePressed"))
photoImageView.userInteractionEnabled = true // this line is important
photoImageView.addGestureRecognizer(tapGesture)

Шаг 2

func imagePressed()
{
//do  Your action here  whatever you want 
}
person Anbu.Karthik    schedule 25.01.2016
comment
Куда бы я добавил это? И это то, о чем я все время думал (по крайней мере, в этом направлении, поскольку я не хочу отдавать себе много чести), но разработчик Apple нигде этого не показывает. - person Parker O'Connel; 25.01.2016
comment
на viewdidload вызовите это - person Anbu.Karthik; 25.01.2016
comment
Анду, я безуспешно пытался вставить код в несколько разных мест. Не стесняйтесь относиться ко мне как к моему двухлетнему сыну и дайте мне знать, куда вставить код. Кроме того, могу ли я просто скопировать и вставить код, который находится в фонде selectuserimagefromlibrary, и вставить его в func imagepressed()? - person Parker O'Connel; 26.01.2016
comment
Спасибо Анбу! Я смог заставить его работать и ценю помощь! Я добавил рабочий код выше. - person Parker O'Connel; 27.01.2016

Я обнаружил, что самый простой способ решить проблему - установить флажок «Взаимодействие с пользователем включено» в редакторе атрибутов для просмотра изображения. Снимок экрана

person Bimba Kampli    schedule 01.08.2016
comment
По сути, эта ошибка возникает из-за отсутствия инструкции № 12 в разделе «Добавить фотографию еды»: в инспекторе атрибутов найдите поле «Взаимодействие» и установите флажок «Взаимодействие с пользователем включено». Эта функция понадобится вам позже, чтобы пользователи могли взаимодействовать с представлением изображения. - person ToneDaBass; 08.02.2017
comment
Перед подключением контроллера Tap Gesture Recognizer к контроллеру Image View необходимо установить флажок True User Interaction Enabled. - person Udara Seneviratne; 29.03.2017

Ваш код в полном порядке. Проблема с UIImageView в раскадровке. Параметр user interaction не отмечен.

Так что вам просто нужно включить эту опцию в раскадровке.

  1. Перейдите к своей доске рассказов.

  2. Выберите свой UIImageView (вы назвали его photoimageview)

  3. Теперь в «Attribute Inspector» ищем user interaction enabled, он должен быть «проверен»

  4. Теперь запустите свой проект, он будет работать.

введите здесь описание изображения

person Akash Bhardwaj    schedule 19.09.2017

Где вы добавили UITapGestureRecognizer для просмотра изображения? Если вы добавили его в раскадровку, вы подключили его к селектору selectImageFromPhotoLibrary:?

person lostInTransit    schedule 25.01.2016
comment
жест касания был добавлен в раскадровку на ImageView, а затем подключен с помощью перетаскивания под //Mark: Actions with the UITapGesture - person Parker O'Connel; 25.01.2016