我试图强行在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];
因此,尝试找出所有菜单项并强行删除所需的菜单项