我试图强行在UITextField上隐藏“粘贴”气泡。
我的实现是从UIResponderStandardEditActions指定一个禁止选择器的列表,将其存储在UIResponder类别的AssociatedValue中,如果在列表中找到操作,则过早退出类别的canPerformAction:withSender:。这是一种非常诱人的方法,因为它可以控制项目中的任何Responder。

问题是当我在paste:内部点击时,整个响应者链中的canPerformAction:withSender:操作都无法达到任何UITextField方法。我在UIResponder上写了一个类别,然后在其中打了个草稿的canPerformAction:withSender:,因此可以确定:

- (BOOL)my_canPerformAction:(SEL)action withSender:(id)sender {
    NSString *string = NSStringFromSelector(action);
    BOOL prohibited = [self.prohibitedActions containsObject:string];

    if (prohibited) {
        return NO;
    }

    BOOL canPerform = [self my_canPerformAction:action withSender:sender];
    return canPerform;
}

我的层次结构的全部收获是:
 cut:
 copy:
 select:
 selectAll:
 delete:
 _promptForReplace:
 _transliterateChinese:
 _insertDrawing:
 _showTextStyleOptions:
 _lookup:
 _define:
 _define:
 _addShortcut:
 _accessibilitySpeak:
 _accessibilitySpeakLanguageSelection:
 _accessibilityPauseSpeaking:
 _share:
 makeTextWritingDirectionLeftToRight:

禁止_promptForReplace:没有帮助。另外,我的TextField没有实现canPerformAction:withSender:

那么,我应该怎么做才能追踪并隐藏该讨厌的粘贴?

最佳答案

因此,我将迅速这样做:

UIMenuController.shared.menuItems?.removeAll(where: {$0.title == "paste"})

在Objective-C中,您可以尝试如下操作:
 UIMenuController * controller = [UIMenuController sharedMenuController];
     NSArray * items = [controller menuItems]; // These are all custom items you added
     NSMutableArray * finalItemsYouWant = [NSMutableArray array];
     // Here you can check what items you don't want and then remove it
     [controller setMenuItems:finalItemsYouWant];

因此,尝试找出所有菜单项并强行删除所需的菜单项

07-24 09:55