用过苹果的都知道,在输入框、文字展示页等地方,长按文字会弹出一个操作,可以拷贝、剪切、定义、全选等等
就是这货,都见过吧
有人会发现,哎?这个操作面板长相差不多,但是每次见到都不大一样。具体显示哪些操作选项,是程序可控制的吗?
答案是: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中的方法控制