2

我在 viewDidLoad 中以编程方式创建我的 UITextView。
当我选择文本时,菜单会显示以下内容:

在此处输入图像描述

如图所示,我添加了两个自定义按钮,突出显示和取消突出显示。我想删除“复制”选项并保留所有其他选项,所以我不能使其不可编辑,我需要允许用户从文本中选择他想要的任何内容,但阻止它复制内容。
我尝试了几种方法,包括所有社区所指的方法:

- (BOOL)canPerformAction:(SEL)action withSender:(id)sender
{
     NSLog(@"it went in canPerform");
     if (action == @selector(copy:)){

          NSLog(@"It prevented the copy option and hid it from the menu");
          return NO;

     }
     return [super canPerformAction:action withSender:sender];
}

为了更好地查看问题,如果选择器实际上考虑了“复制”选项,我尝试注销,这是我的日志:

2015-05-20 11:27:47.637 MyApp[56604:11786730] it went in canPerform

2015-05-20 11:27:47.637 MyApp[56604:11786730] it went in canPerform

2015-05-20 11:27:47.638 MyApp[56604:11786730] it went in canPerform

2015-05-20 11:27:47.638 MyApp[56604:11786730] it went in canPerform

2015-05-20 11:27:47.638 MyApp[56604:11786730] it went in canPerform

2015-05-20 11:27:47.638 MyApp[56604:11786730] it went in canPerform

2015-05-20 11:27:47.638 MyApp[56604:11786730] it went in canPerform

2015-05-20 11:27:47.638 MyApp[56604:11786730] it went in canPerform

2015-05-20 11:27:47.663 MyApp[56604:11786730] it went in canPerform

2015-05-20 11:27:47.664 MyApp[56604:11786730] it went in canPerform

2015-05-20 11:27:47.664 MyApp[56604:11786730] it went in canPerform

2015-05-20 11:27:47.664 MyApp[56604:11786730] it went in canPerform

2015-05-20 11:27:47.664 MyApp[56604:11786730] it went in canPerform

2015-05-20 11:27:47.664 MyApp[56604:11786730] it went in canPerform

2015-05-20 11:27:47.664 MyApp[56604:11786730] it went in canPerform

2015-05-20 11:27:47.664 MyApp[56604:11786730] it went in canPerform

如图所示,代码正在调用“canPerformAction”,因为日志显示“它进入 canPerform”,但它没有识别“复制”操作,因为日志从未显示:“它阻止了复制选项并将其隐藏菜单”。
因此,我的问题是我需要从选定的文本菜单中隐藏“复制”项目。我错过了什么?

4

3 回答 3

2

对于所有必须处理这种情况的未来开发人员,我知道您会感到多么沮丧,所以我将给出一个完整的教程,因为我遇到了结合了大多数已发布答案的正确答案:

1 - 我会仅当您以编程方式创建 UITextView 时才有效,如果您使用情节提要创建它则不起作用,这是最重要的部分,因为如果您已经使用情节提要创建了 UITextView,您将无法删除“复制”,您将能够删除其他所有内容!只是不是副本

2 - 您必须继承 UITextView 类,对于所有新开发人员,这是通过创建一个新类并将其选择为 UITextView 的子类来完成的。

3 - 你的 .h 文件看起来像这样

//
//  myCustomClass.h
//  myApp
//
//  Created by Elias Rahme on 5/20/15.
//  Copyright (c) 2015 Elias Rahme. All rights reserved.
//

#import <UIKit/UIKit.h>

@interface myCustomClass : UITextView

@end

你的 .m 文件将是这样的:

//
//  myCustomClass.m
//  myApp
//
//  Created by Elias Rahme on 5/20/15.
//  Copyright (c) 2015 Elias Rahme. All rights reserved.
//

#import "myCustomClass.h"

@implementation myCustomClass


-(BOOL)canPerformAction:(SEL)action withSender:(id)sender {
     if (action == @selector(copy:)) {
          return NO;
     }
     return [super canPerformAction:action withSender:sender];
}
@end

4 - 现在,在设置完所有内容之后,棘手的部分来了。在你想使用 UITextView 的类中,当然包括你的 customClass,然后,这就是你调用 textView 的方式:

首先,你必须创建一个新的 UITextView,这可以通过UITextView *newTextView;在实现的正上方编写来完成,就像你做的那样创建任何变量。

其次,在你完成所有工作的实际课堂上,转到你的 .h 文件,并确保它看起来像这样

#import <UIKit/UIKit.h>

@interface myActuallClassWhereIWantTheActualWorkToBeDone : UIViewController< UITextViewDelegate>{


}

第三,将以下行添加到您的 viewDidLoad 方法:

 newTextView = [[myCustomClass alloc] initWithFrame:CGRectMake(yourX, yourY, yourWidth, yourHeight)];
newTextView.text = @"This is the best small tutorial EVER!!";
 newTextView.delegate = self;

你去那里,运行你的应用程序,你不会看到“复制”选项!这是一个简单而棘手的过程,我花了几个小时才真正总结了我访问过的所有网页!希望大家喜欢!

于 2015-05-21T12:12:26.960 回答
0

canPerformAction(_:withSender:)是一个 UIResponder 方法,所以如果你在 viewController 中实现它,它只会在 viewController 上调用 copy: 时触发。文档说:“请求接收响应者启用或禁用用户界面中的指定命令。

您必须继承 UITextView 并在子类中实现它,我为您创建了一个简单的要点

于 2015-05-20T09:09:03.543 回答
-1

试试这个

UIMenuItem *textItem1 = [[UIMenuItem alloc] initWithTitle:NSLocalizedString(@"Start", nil) action:@selector(start:)];
UIMenuItem *textItem2 = [[UIMenuItem alloc] initWithTitle:NSLocalizedString(@"Reply", nil) action:@selector(reply:)];

UIMenuItem *textItem3 = [[UIMenuItem alloc] initWithTitle:NSLocalizedString(@"Report Abuse", nil) action:@selector(startreport:)];

[UIMenuController sharedMenuController].menuItems = @[textItem1, textItem2, textItem3];



[[UIMenuController sharedMenuController] setTargetRect:cell.imgBg.frame inView:cell.contentView];
[[UIMenuController sharedMenuController] setMenuVisible:YES animated:YES];
于 2015-05-20T08:56:33.967 回答