2015-10-06 94 views
3

我有UITextView,我想在其上添加高亮作为自定义菜单项。我已注册以下通知UIMenuControllerWillShowMenuNotificationUIMenuController不会第一次更新菜单

的通知的方法是这样的:

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] 
} 

虽然第一次失败menucontroller即使它执行的代码部分进行更新。它显示最后一个值。我应该在哪里编写代码的这一部分,因为我觉得在willShow menuController期间它已经创建并因此无法更新。

回答

0

希望你现在已经解决了这个问题,但我只是自己想出了这个问题: 其他回答说你可以在调用UIMenuControllerWillShowMenuNotification时添加它来更新菜单项,但这不起作用对我来说(iOS 9,Swift 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 
} 
+0

感谢。这个问题太旧了,所以我不记得现在的问题,但希望你的解决方案是正确的我接受它。 – meteors

相关问题