如何使用UIMenuController iOS5.1防止在UITextView上复制/粘贴/selectpopup窗口

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

我不想去UIWebView的溃败,因为我已经使用UIViewsUITextFields进行数据input。 我已经尝试过,在我的视图控制器的实现文件中使用方法: targetForAction:withSendersetMenuVisible:animated ,最后canPerformAction:withSender实现解决UITextField的解决scheme失败 。 (它不劳作 – [悲伤的脸])

好吧,我发现了一个工作解决scheme (在Xcode 5.1 )对我的问题,简而言之,是UITextField的子类。

我意识到我并不是真正覆盖视图控制器中的UITextField的默认行为,就像我想要的,也没有把这里列出的方法覆盖视图控制器文件中的文本字段委托的行为。 关键是用-targetForAction:withSender子类化UITextField本身。 (我知道你们中的一些人正在屏幕上尖叫,这是怎么回事!)这对我来说并不明显。 像大多数问题一样,我经历了很多不同的path,有些是我在这里find的。 但是解决scheme很简单。 我想在自己的领域分享这个解决scheme,希望能够帮助别人。

头文件:

// // #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,如下图所示:

自定义类:TPTextfield

我把它放在这里 ,以方便访问。 请让我知道这是否对你有帮助!

托尼

如果将UITextView作为故事板上的对象创build,则解决scheme更加容易。 在UITextView对象的属性检查器中,在“行为”下,取消选中“可编辑”,然后取消选中“可选”。 在“滚动视图”部分下,如果您希望用户能够滚动文本,则可以选中“滚动已启用”。