如何控制UITextField的拷贝、剪切面板

用过苹果的都知道,在输入框、文字展示页等地方,长按文字会弹出一个操作,可以拷贝、剪切、定义、全选等等

就是这货,都见过吧
这里写图片描述

有人会发现,哎?这个操作面板长相差不多,但是每次见到都不大一样。具体显示哪些操作选项,是程序可控制的吗?

答案是:YES。弹出面板的选项可控制

——————–直接上代码—————————

//如果需要控制弹出选项,可以扩展子类,重载方法

//头文件
@interface SubTextField : UITextField
@end

//实现文件
@implementation SubTextField

//重载方法,控制弹出选项
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender
{
    if (action == @selector(paste:))//粘贴
    {
        return NO;
    }
    else if (action == @selector(copy:))//赋值
    {
        return NO;
    }
    else if (action == @selector(select:))//选择
    {
        return NO;
    }

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

@end

canPerformAction:withSender中,判断sender函数,return NO表示不允许此项操作,return YES表示允许。

顺便说一下,这里提供的操作很多,好奇宝宝可以试一下效果
cut:
copy:
select:
selectAll:
paste:
delete:
_promptForReplace:
_transliterateChinese:
_showTextStyleOptions:
_define:
_addShortcut:
_accessibilitySpeak:
_accessibilityPauseSpeaking:
_accessibilitySpeakLanguageSelection:
_share:
makeTextWritingDirectionRightToLeft:
makeTextWritingDirectionLeftToRight:

——————–程序直接操作————————-

有产品提出了变态需求,我不想让用户点击操作,我要直接全选!

我的内心是拒绝的!然而研究一下,发现实现非常简单

上面已经说过,cut: copy:等事件都可以进行控制。实际上呢,这些方法都是UIResponder中的,而UIView UIViewController都继承自UIResponder,他们应该都可以调用这个方法,至于会产生什么结果可以自行尝试。

这里以UITextField为例:

CGRect frame = CGRectMake(40, 100, 100, 30);
textfield = [[SelectAllTextField alloc] initWithFrame:frame];
textfield.text = @"aloha";
[self.view addSubview:textfield];
textfield.backgroundColor = [UIColor yellowColor];

这里是一个普通的textfield,展示效果如下

这里写图片描述

如果直接调用 [textfield selectAll:nil]; 是否有效呢?
经过尝试,这取决于selectAll:方法的调用位置。

如果在viewDidLoad中调用selectAll:是无效的,我猜测的原因是视图的响应链还没有建立。

- (void)viewDidLoad {
    [super viewDidLoad];

    CGRect frame = CGRectMake(40, 100, 100, 30);
    textfield = [[SelectAllTextField alloc] initWithFrame:frame];
    textfield.text = @"aloha";
    [self.view addSubview:textfield];
    textfield.backgroundColor = [UIColor yellowColor];
    [textfield selectAll:nil];//响应无效
}

如果在其他调用函数,比如按钮的btnClick:中,selectAll:有效

- (void)btnClick:(id)sender {
    CGRect frame = CGRectMake(40, 100, 100, 30);
    textfield = [[SelectAllTextField alloc] initWithFrame:frame];
    textfield.text = @"aloha";
    [self.view addSubview:textfield];
    textfield.backgroundColor = [UIColor yellowColor];

    [textfield selectAll:nil];//响应有效
}

响应效果如下
这里写图片描述


综上,如果你对控制板有兴趣,可以用UIResponder中的方法控制

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值