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,还是它内部行为的一些奇怪之处


我的错是太依赖于旋转。我不建议您使用这种“通用”方法,例如使用“禁止”操作选择器列表创建一个类别,以便与任何响应者一起工作。

谢谢您的建议,但您的示例仅涵盖自定义菜单项,而我的问题涉及系统操作,如粘贴、复制、剪切、选择、全选等。