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

- (BOOL) canBecomeFirstResponder

{

    return YES;

}

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

{

    if ( [UIMenuController sharedMenuController] ) {

       [UIMenuController sharedMenuController].menuVisible = NO;

    }

    return YES;

}

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



其中下边这些是可以访问的公开方法
- (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;
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值