Ios 无粘贴:canPerformAction:withSender中的操作:
我试图在我的Ios 无粘贴:canPerformAction:withSender中的操作:,ios,objective-c,uitextfield,paste,uiresponder,Ios,Objective C,Uitextfield,Paste,Uiresponder,我试图在我的UITextField上强制隐藏粘贴气泡。 我的实现是从UIResponderStandardEditActions中指定禁止的选择器列表,将其存储在UIResponder类别中的关联值中,如果在列表中发现操作,则过早退出类别的canperformation:withSender:。这是一种非常诱人的方法,因为它允许控制项目中的任何响应者 问题是没有paste:操作到达任何canPerformAction:withSender:方法,当我点击我的UITextField内部时,整个响应
UITextField
上强制隐藏粘贴气泡。
我的实现是从UIResponderStandardEditActions
中指定禁止的选择器列表,将其存储在UIResponder
类别中的关联值中,如果在列表中发现操作,则过早退出类别的canperformation:withSender:
。这是一种非常诱人的方法,因为它允许控制项目中的任何响应者
问题是没有paste:
操作到达任何canPerformAction:withSender:
方法,当我点击我的UITextField
内部时,整个响应程序链都会出现。我在UIResponder
上写了一个类别,并在那里用sender:切换了canperformation:with,因此我可以确定:
- (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:
禁止\u promptForReplace:
没有帮助。此外,my TextField未实现canPerformAction:withSender:
那么,我应该做些什么来追踪和隐藏那个讨厌的粘贴呢?所以在swift中,我会这样做:
UIMenuController.shared.menuItems?.removeAll(where: {$0.title == "paste"})
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];
在objective-c中,您可以尝试以下内容:
UIMenuController.shared.menuItems?.removeAll(where: {$0.title == "paste"})
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];
因此,尝试找出所有菜单项并强制删除所需的菜单项在UITextField
上创建类别,而不是UIResponder
完成了该操作。
子类化UITextField
并实现canperformation:with sender:
也可以
结果表明,UIResponder上的类别不会影响UIResponder上的执行:with sender:
即使UIExtField
是一个UIResponder
。我不知道这是iOS中的一个bug,还是它内部行为的一些奇怪之处
我的错是太依赖于旋转。我不建议您使用这种“通用”方法,例如使用“禁止”操作选择器列表创建一个类别,以便与任何响应者一起工作。谢谢您的建议,但您的示例仅涵盖自定义菜单项,而我的问题涉及系统操作,如粘贴、复制、剪切、选择、全选等。