Быстрое пользовательское действие `UIMenuController` - PullRequest
0 голосов
/ 15 ноября 2018

Я реализовал пользовательский просмотр текста, используя TextKit. Также у меня есть пользовательский выбор текста, реализованный с UILongPressGesture. Я сделал успехи в копировании выделенного текста с помощью стандартного всплывающего меню UIMenuController.

Я хочу реализовать пользовательское определение текста. Либо переопределение стандартного действия определения (понятия не имею, если оно вообще существует), либо пользовательский UIMenuItem.

Пока у меня есть следующее:

@objc func longTap(sender: UILongPressGestureRecognizer) {
    ...
    becomeFirstResponder()
    let copyItem = UIMenuItem(title: "Copy", action: #selector(copySelector))
    let defineItem = UIMenuItem(title: "Define", action: #selector(defineSelector))
    UIMenuController.shared.menuItems = [copyItem, defineItem]
    UIMenuController.shared.setTargetRect(...)
    UIMenuController.shared.setMenuVisible(true, animated: true)
}

override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {
    if action == #selector(CenterViewController.copySelector) {
        return true
    } else if action == #selector(CenterViewController.defineSelector) {
        return true
    }
    return false
}

....

@objc func defineSelector() {
    // Use device's dictionary? 
    // ??
    customTextView.clearSelection()
}

А вот и вопрос: как реализовать defineSelector?

Я искал везде, но ответов нет. Есть ли способ использовать словари и представить модальное представление с определениями? Как это делается системой с любым выделенным текстом.

1 Ответ

0 голосов
/ 19 ноября 2018

Неважно, я нашел решение:

@objc private func defineSelector() {
    if let text = textToCopy {
        let txt = UITextView(frame: CGRect(x: 100, y: 100, width: 100, height: 100))
        txt.isHidden = true
        view.addSubview(txt)
        txt.text = text
        txt.isEditable = false
        txt.becomeFirstResponder()
        txt.selectedRange = NSRange(0..<text.count)
        let selector = Selector(("_define:"))
        if txt.canPerformAction(selector, withSender: nil) {
            txt.perform(selector, with: nil)
        }
        txt.removeFromSuperview()
    }
    customTextView.clearSelection()
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...