UITextView长按弹出UIMenuController,剪切拷贝选择全选粘贴删除

来源:互联网 发布:华为交换机查mac ip 编辑:程序博客网 时间:2024/04/29 02:58

- (BOOL) canBecomeFirstResponder

{

    returnYES;

}

- (BOOL) canPerformAction:(SEL)action withSender:(id)sender

{

    if ( [UIMenuControllersharedMenuController] ) {

       [UIMenuControllersharedMenuController].menuVisible =NO;

    }

    returnYES;

}

 如下:将会全部显示出来:



其中下边这些是可以访问的公开方法
- (void)cut:(nullableid)senderNS_AVAILABLE_IOS(3_0);
- (void)copy:(nullableid)senderNS_AVAILABLE_IOS(3_0);
- (void)paste:(nullableid)senderNS_AVAILABLE_IOS(3_0);
- (void)select:(nullableid)senderNS_AVAILABLE_IOS(3_0);
- (void)selectAll:(nullableid)senderNS_AVAILABLE_IOS(3_0);
- (void)delete:(nullableid)senderNS_AVAILABLE_IOS(3_2);
- (void)makeTextWritingDirectionLeftToRight:(nullableid)senderNS_AVAILABLE_IOS(5_0);
- (void)makeTextWritingDirectionRightToLeft:(nullableid)senderNS_AVAILABLE_IOS(5_0);

现在有个需求如下图:添加一个"添加为模版"

607989-e6d7bce9e790a1f7.png



第一种代码  

代码如下:自定义了一个PHTTextView 继承UITextView 中加入一下代码

-(BOOL)canPerformAction:(SEL)action withSender:(id)sender

{

if(action ==@selector(copy:) ||

action ==@selector(selectAll:)||

action ==@selector(cut:)||

action ==@selector(select:)||

action ==@selector(paste:)) {

return[supercanPerformAction:actionwithSender:sender];//

}

returnNO;

}


在使用PHTTextView的controller中添加如下代码

UIMenuItem*menuItem = [[UIMenuItemalloc]initWithTitle:@"添加为模板"action:@selector(addToTemplate:)];

UIMenuController*menu = [UIMenuControllersharedMenuController];

[menusetMenuItems:[NSArrayarrayWithObjects:menuItem,nil]];

实现效果上图那样. 点击"全选"之后   全选按钮 就没有了 

607989-f94df1159008c23e.png



第三种代码 
把 PHTTextView 中的 -(BOOL)canPerformAction:(SEL)action withSender:(id)sender方法改为第一种代码
让后在viewcontroller中添加了 如下 代码
-(BOOL)canPerformAction:(SEL)action withSender:(id)sender
{
if(action ==@selector(addToTemplate:)) {//添加为模板方法
if(self.contentView.selectedRange.length>0) {
returnYES;
}else{
returnNO;
}
return[supercanPerformAction:actionwithSender:sender];
}
效果如下

607989-c0869398d22ee426.png


点击"全选"或者"选择"之后 才会出来 "添加为模板" 是因为 这句话 if(self.contentView.selectedRange.length>0) {returnYES;}else{returnNO;} 如果textview 又被选择的文字 才会 返回 yes 否则no 

607989-88dbe24873626c11.png


新建一个UITextField的子类,重写canPerformAction:withSender:方法并返回 NO 即可禁止粘贴:

- (BOOL)canPerformAction:(SEL)action withSender:(id)sender{    if (action == @selector(paste:))        return NO;    return [super canPerformAction:action withSender:sender];} 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

或者禁止长按弹出UIMenuController菜单,但是这样做的话,想要复制UITextField内容的操作也一起被禁止了:

-(BOOL)canPerformAction:(SEL)action withSender:(id)sender {    UIMenuController *menuController = [UIMenuController sharedMenuController];    if (menuController) {        [UIMenuController sharedMenuController].menuVisible = NO;    }    return NO;}

0 0
原创粉丝点击