Не показывать menuController и не может понять, как заставить View возвращать значение True для вызова .becomeFirstResponder - PullRequest
0 голосов
/ 19 марта 2019

У меня нет шоу menuController, и я проверил все предложения в предыдущих вопросах. Оказывается, imageView Я включил UILongPressGestureRecognizer, чтобы показать меню, возвращает False при вызове .becomeFirstResponder непосредственно перед настройкой контроллера меню.

Я пишу код в swift 4 и не могу понять, как заставить imageView вернуть True для вызова .becomeFirstResponder. Помогите!

/*********************************************************/
override func viewDidLoad() {

super.viewDidLoad()

// long tap to show menu that enables deletion of the image.
imageView_1.isUserInteractionEnabled = true
let longPressRecogniser = UILongPressGestureRecognizer(target: self, action: #selector(longPressOnImage(_:)))
//longPressRecogniser.numberOfTapsRequired = 1
//longPressRecogniser.numberOfTouchesRequired = 1
longPressRecogniser.minimumPressDuration = 0.5
imageView_1.addGestureRecognizer(longPressRecogniser)

imageView_1.image = placeHolderImage_1
imageView_2.image = placeHolderImage_2
}

/*********************************************************/
@IBAction func longPressOnImage(_ gestureRecognizer: UILongPressGestureRecognizer) {

print(#function)        
        if gestureRecognizer.state == .began {
            //print("gestureRecognizer.state == .began")
            self.tappedView = gestureRecognizer.view!

if tappedView.canResignFirstResponder {
    print("can resign first responder")
}
if tappedView.becomeFirstResponder() {
    print("returned TRUE to becomeFirstResponder")
} else {
    print("returned FALSE to becomeFirstResponder")
}
    // Configure the shared menu controller
    let menuController = UIMenuController.shared

    // Configure the menu item to display
    // Create a "delete" menu item

    let deleteImage = UIMenuItem(title: "Delete", action: #selector(deleteImage_1))

    menuController.menuItems = [deleteImage]

    // Set the location of the menu in the view.


    let location = gestureRecognizer.location(in: tappedView)
print("location = ", location)
         let menuLocation = CGRect(x: location.x, y: location.y, width: 2, height: 2)
        menuController.setTargetRect(menuLocation, in: tappedView)

    //update the menu settings to force it to display my custom items
    menuController.update()

    // Show the menu.
    menuController.setMenuVisible(true, animated: true)
print("menu should be visible now")
        }
    }

/*********************************************************/
@objc func deleteImage_1() {
    print(#function)
}

Вывод команды печати отладки моего пещерного человека:

longPressOnImage

может подать в отставку первый респондент

вернул FALSE в сталFirstResponder

location = (207.0, 82.0)

меню должно быть видно сейчас

Ответы [ 2 ]

0 голосов
/ 20 марта 2019

Спасибо, Адри. Ваш ответ - решение моей проблемы. В других статьях я читал похожие вопросы о переопределении var canBecomeFirstResponder, но либо упустил из виду, либо не было явно указано, что необходимо создать собственный класс UIImageView.

Просто чтобы прояснить новичкам, таким как я, класс imageView в storyBoard и его @IBOutlet в его viewController должны быть напечатаны как ResponsiveImage. Если изменен только один из них, сообщается об ошибке приведения типа.

Большое спасибо за то, что закончили мои часы разочарования! : -)

0 голосов
/ 19 марта 2019

Создайте пользовательский класс imageView и переопределите свойство canBecomeFirstResponder, например:

class ResponsiveImage : UIImageView{
    override var canBecomeFirstResponder: Bool{
        return true
    }
}

Используйте этот тип ResponsiveImage, и ваш код будет работать:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...