Невозможно отключить UIMenuItems по умолчанию в UIMenuController в UITextView - PullRequest
0 голосов
/ 25 июня 2018

Я пытаюсь настроить пункты меню UIMenuController для функциональности, аналогичной функции iOS Medium:

enter image description here

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

Мне удалось добавить пользовательский пункт меню «printToConsole», но я не могу отключить стандартные пункты меню Apple, такие как вырезать, копировать, вставить, B I U, и т.д.

enter image description here

Похоже, консенсус заключается в том, что я должен переопределить canPerformAction, чтобы отключить эти элементы меню по умолчанию, но это, похоже, не работает:

override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {
    print("canPerformAction being called")

    if action == #selector(cut(_:)) {
        return false
    }
    if action == #selector(copy(_:)) {
        return false
    }
    if action == #selector(select(_:)) {
        return false
    }
    if action == #selector(paste(_:)) {
        return false
    }
    if action == #selector(replacementObject(for:)) {
        return false
    }
    if action == #selector(selectAll(_:)) {
        return false
    }
    if action == #selector(printToConsole) {
        return true
    }

    return super.canPerformAction(action, withSender: sender)
}

Это остаток моего соответствующего кода:

func addCustomMenu() {
    let consolePrintAction = UIMenuItem(title: "Print To Console", action: #selector(printToConsole))
    UIMenuController.shared.menuItems = [consolePrintAction]
    UIMenuController.shared.update()

}

@objc func printToConsole() {
    if let range = articleTextView.selectedTextRange, let selectedText = articleTextView.text(in: range) {
        print(selectedText)
    }
}

И на мой взгляд DidLoad:

articleTextView.delegate = self
addCustomMenu()

Я также настроил свой viewController на UITextViewDelegate. Некоторые предполагают, что если вы просто создадите подкласс TextView, это будет как-то работать. Я не смог заставить это работать, так что, если это действительно ответ, кто-то может привести пример?

Опять же, я знаю, что это может показаться дубликатом, но вышеприведенное решение перестало работать с обновлением iOS.

Спасибо.

1 Ответ

0 голосов
/ 25 июня 2018

Буду отдавать должное @gaurav за его ответ на этот вопрос, который, должно быть, ускользнул от меня в моей охоте на SO: https://stackoverflow.com/a/46470592/7134142

Ключевым фрагментом кода является расширение UITextView вместо его подкласса:

extension UITextView {
open override func canPerformAction(_ action: Selector, withSender
    sender: Any?) -> Bool {
    return false
}

Переопределение canPerformAction в контроллере моего представления было ненужным, и приведенный выше код по-прежнему позволяет добавлять элементы пользовательского меню. Вот чем я закончил:

enter image description here

...