3

我有 UITextView 我想在其上添加突出显示作为自定义菜单项。我已注册以下通知UIMenuControllerWillShowMenuNotification

通知的方法是这样的:

if textIsHighlighted {
    let highlightMenuItem = UIMenuItem(title: "Highlight", action: Selector("highlightText"))
    UIMenuController.sharedMenuController().menuItems = [highlightMenuItem]
}
else {
    let highlightMenuItem = UIMenuItem(title: "Dehighlight", action: Selector("highlightText"))
    UIMenuController.sharedMenuController().menuItems = [highlightMenuItem]
}

尽管菜单控制器第一次更新失败,即使它执行了部分代码。它显示最后一个值。我应该在哪里编写这部分代码,因为我觉得在 willShow menuController 期间它已经创建,因此无法更新。

4

1 回答 1

0

希望您现在已经解决了这个问题,但我自己已经解决了这个问题:其他答案说您可以通过在UIMenuControllerWillShowMenuNotification调用时添加菜单项来更新菜单项,但这对我不起作用(iOS 9,斯威夫特 2)。

相反,我实现了UITextView委托方法:textViewDidChangeSelection并在那里设置了相关的菜单项:

func textViewDidChangeSelection(textView: UITextView) {
    if self.currentSelectionIsInHighlightedRange() {
        self.setUpUnhighlightMenuItem()
    } else {
        self.setUpHighlightMenuItem()
    }
}

private func currentSelectionIsInHighlightedRange() -> Bool {
    let allHighlightedRanges = self.document.highlightedRanges()

    let selectedTextRange = self.documentView.textView.selectedRange

    for range in allHighlightedRanges {
        let intersectionRange = NSIntersectionRange(range, selectedTextRange)
        if intersectionRange.length > 0 {
            return true
        }
    }
    return false
}
于 2016-06-07T03:26:56.340 回答