Как отключить подсказку корректного текста в UITextView?

Я использую UITextView для показа текста в ячейке таблицы.

По нажатию на ячейку(по textView) я открываю экран для редактирования текста переопределив метод делегата(UITextViewDelegate) textViewDidBeginEditing(установив туда свой хэндлер).

Если слово было введено не корректно, то по нажатию на это слово выскакивает подсказка с корректным словом. Предположу что это UIMenuController(99%), но в иерархии не видно это меню. Мало того что подсказка выскакивает, так еще и с задержкой, что приводит к тому что она оказывается уже поверх открытого нового экрана для редактирования текста.

func textViewDidBeginEditing(_ textView: UITextView) {
    textView.resignFirstResponder()
    selectHandler?()
}

1) textView.isSelectable - мне не подходит, так как потом не работает textViewDidBeginEditing.

2) textView.isEditable - также не подходит.

3) с canPerformAction - ничего не получается(я перепробовал кучу различных способов). Допустим код ниже.

override var canBecomeFirstResponder: Bool {
    return false
}

Или допустим это.

override public func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {
    if action == #selector(copy(_:)) || action == #selector(paste(_:)) || action == #selector(UIResponderStandardEditActions.paste(_:)) ||
        action == #selector(replace(_:withText:)) ||
        action == #selector(UIResponderStandardEditActions.cut(_:)) ||
    action == #selector(UIResponderStandardEditActions.select(_:)) ||
    action == #selector(UIResponderStandardEditActions.selectAll(_:)) ||
    action == #selector(UIResponderStandardEditActions.delete(_:)) ||
    action == #selector(UIResponderStandardEditActions.makeTextWritingDirectionLeftToRight(_:)) ||
    action == #selector(UIResponderStandardEditActions.makeTextWritingDirectionRightToLeft(_:)) ||
    action == #selector(UIResponderStandardEditActions.toggleBoldface(_:)) ||
    action == #selector(UIResponderStandardEditActions.toggleItalics(_:)) ||
    action == #selector(UIResponderStandardEditActions.toggleUnderline(_:)) ||
    action == #selector(UIResponderStandardEditActions.increaseSize(_:)) ||
    action == #selector(UIResponderStandardEditActions.decreaseSize(_:))

   {
        return false
    }

    return true
}

4) textView.autocorrectionType = .no - не для этого, не по моей проблеме.

5) Такой способ тоже не подойдет, смотрите код ниже.

func textViewDidChangeSelection(_ textView: UITextView) {
    view.endEditing(true)
}

6) UIMenuController.shared.isMenuVisible = false - это не срабатывало в разных способах.

7) textView.isUserInteractionEnabled = false - мне точно не подходит.

Выделение с некорректного текста красным маркером(помимо этой всплывающей подсказки), которое тоже нужно было не показывать, я смог убрать с помощью этого кода ниже.

func textViewDidChangeSelection(_ textView: UITextView) {
    let selectedRange: UITextRange? = textView.selectedTextRange
    var selectedText: String? = nil
    if let selectedRange = selectedRange {
        selectedText = textView.text(in: selectedRange)
    }
    if (selectedText?.count ?? 0) > 1 && (selectedText?.count ?? 0) <= textView.text.count {
        textView.selectedRange = NSRange(location: 0, length: 0)
    }
}

Вопрос: есть идеи? подскажите их пожалуйста.

скрин1

скрин2


Ответы (1 шт):

Автор решения: Igor Rublev

Решение:

Шаг 1(делаем кастомный класс для UITextView):

import Foundation
import UIKit

final class CustomTextView: UITextView {

    var selectHandler: (() -> Void)?

    override func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
        if let _ = gestureRecognizer as? UIPanGestureRecognizer {
            return true
        }
        selectHandler?()
        return false
    }
}

Шаг 2(назначаем свое действие для selectHandler в самой ячейке):

textView.selectHandler = selectHandler(Твой метод, который хочешь вызывать)

Не забываем установить новый класс для аутлета textView(CustomTextView).

В том числе и для ксибины.

→ Ссылка