如何使用 UIMenuController iOS5.1 防止 UITextView 上的复制/粘贴/选择弹出框

Posted

技术标签:

【中文标题】如何使用 UIMenuController iOS5.1 防止 UITextView 上的复制/粘贴/选择弹出框【英文标题】:How do Prevent a copy/paste/select popover on a UITextView using UIMenuController iOS5.1 【发布时间】:2014-07-01 15:30:58 【问题描述】:

问题:如何防止出现在 UITextView 上的复制/粘贴/选择弹出窗口(不使用 UIwebView 和 CSS)?

我不想在 UIWebView 中一败涂地,因为我已经在使用 UIViewsUITextFields 进行数据输入.我曾尝试不成功在我的视图控制器的实现文件中实现处理 UITextField 的解决方案,方法是:targetForAction:withSendersetMenuVisible:animated,最后是 canPerformAction:withSender。 (它没有 WORKY WORKY - [悲伤的脸])

【问题讨论】:

这不是问题。 用我原来的问题重新格式化。谢谢! 您的“问题”更像是一个答案。如果您的目标是回答自己的“问题”,因为您认为这会对其他人有所帮助,而不是将其分解为实际问题并在下面发布实际答案。 好的——我在下面发布了解决我的困境的方法。我希望这更清楚,并帮助一些人在 ios 领域的冒险! 【参考方案1】:

好的,我为我的问题找到了一个工作解决方案(在 Xcode 5.1 中),简而言之,它是 UITextField 的子类化。

我意识到我并没有像我想要的那样真正覆盖视图控制器中 UITextField 的默认行为,也没有将此处列出的方法覆盖视图中文本字段委托的行为控制器文件。 关键是用-targetForAction:withSender子类化UITextField本身。 (我知道你们中的一些人在屏幕上尖叫,说这是多么明显!)这对我来说显而易见。像第一次解决它们时的大多数问题一样,我经历了很多不同的路径,其中一些是我在 SO 中找到的。但解决方案很简单。我想在自己的领域分享这个解决方案,希望它能帮助别人。

头文件:

//
//

#import <UIKit/UIKit.h>

@interface TPTextField : UITextField

- (id)targetForAction:(SEL)action withSender:(id)sender;
@end

和实现文件(.m)

//
//

#import "TPTextField.h"

@implementation TPTextField

- (id)initWithFrame:(CGRect)frame

    self = [super initWithFrame:frame];
    if (self) 
        // Initialization code
    
    return self;

#pragma mark - method overrides - deny user copy/paste on UITTextFields
- (id)targetForAction:(SEL)action withSender:(id)sender

    UIMenuController *menuController = [UIMenuController sharedMenuController];
    if (action == @selector(selectAll:) || action == @selector(paste:) ||action == @selector(copy:) || action == @selector(cut:)) 
        if (menuController) 
            [UIMenuController sharedMenuController].menuVisible = NO;
        
        return nil;
    
    return [super targetForAction:action withSender:sender];


@end

在您的故事板或 nib/xib 文件中,只需将此类连接到您的 UITextfield,如下图所示:

我将它放在 git 上,以便轻松访问 here。如果这对您有帮助,请告诉我!

托尼

【讨论】:

其实这正是canPerformAction:withSender: 的用途。你不应该实现targetForAction:withSender: 不应该使用 targetForAction:withSender: 的原因是什么? @quellish UIResponder 文档。 canPerformAction:withSender: 允许自定义菜单命令。这就是应用程序如何知道编辑菜单命令是否应该在给定上下文中可用的方式。 targetForAction:withSender: 是将命令与目标连接起来的东西 - 在调用 canPerformAction:withSender: 之后以验证该命令是否可用。您想让菜单命令不可用 - canPerformAction:withSender: 是这样做的正确方法。【参考方案2】:

如果将 UITextView 创建为情节提要上的对象,则解决方案会更加简单。在 UITextView 对象的 Attributes Inspector 中,在 Behavior 下,取消选中 Editable 并取消选中 Selectable。在 Scroll View 部分下,如果您希望用户能够滚动文本,您可以选中 Scrolling Enabled。

【讨论】:

以上是关于如何使用 UIMenuController iOS5.1 防止 UITextView 上的复制/粘贴/选择弹出框的主要内容,如果未能解决你的问题,请参考以下文章

IOS UIMenuController UIMenuItem,如何确定使用通用选择器方法选择的项目

如何在 iOS 5 中隐藏 UIMenuController

如何从 iOS 的 UIMenuController 中删除默认的 UIMenuItem?

如何使用 UIMenuController iOS5.1 防止 UITextView 上的复制/粘贴/选择弹出框

在 iOS 的 UIMenuController 开头附加自定义 UIMenuItems

iOS UIMenuController