如何检测用户是否在UIMenuController中点击了格式化按钮?

时间:2013-11-26 17:29:36

标签: ios formatting notifications uitextview uimenucontroller

我的应用程序允许用户使用我创建的一些自定义格式按钮来格式化UITextView中的文本。现在,我想启用文本视图的allowsEditingTextAttributes属性,以便用户可以copy and paste formatted text between text views。这样可以在标准UIMenuController中为文本视图启用粗体/斜体/下划线按钮。这很好,但是当用户通过此菜单更改格式时,我需要调用我的自定义方法来更新自定义格式按钮的状态。如何检测用户是否点击了其中一个UIMenuController的格式化按钮?

我在UITextView和UIMenuController类引用中查找了通知,但没有看到任何相关内容。这些格式设置按钮不会触发UITextViewTextDidChangeNotification,也不会触发UITextViewDelegate的textViewDidChange:方法。我也尝试了子类化UITextView类来覆盖那里的方法,但我不知道要覆盖什么方法。看起来似乎不存在bold:方法,例如,即使那里存在paste:方法。当点击其中一个粗体/斜体/下划线按钮时,是否有人知道调用哪个类的方法?

据我所知,这些按钮未在Text Programming Guide for iOSUIMenuController class reference中提及。

1 个答案:

答案 0 :(得分:2)

这可能会更有帮助。

如果在UITextView子类中实现此方法,则可以控制是否显示菜单选项。您还可以检查日志输出以查看调用的方法。在下面的示例中,我将禁用文本样式选项菜单。

- (BOOL)canPerformAction:(SEL)action withSender:(id)sender {
    LOG(@"canPerformAction: called");
    FLOG(@" action %@", NSStringFromSelector(action));

    if (action == @selector(_showTextStyleOptions:)) {

                return NO;

    }

    return [super canPerformAction:action withSender:sender];
}

这些是一些被检查的选择器:

copy:
select:
selectAll:
paste:
delete:
_promptForReplace:
_showTextStyleOptions:  ***
_define:
etc...

如果选择“文字样式选项”菜单,则会出现以下内容:

toggleBoldface:
toggleItalics:
toggleUnderline:

希望这有帮助。