ios – 在显示附加到inputAccessoryView的UIMenuController中隐藏’select’,’selectAll’,’paste’?

ios – 在显示附加到inputAccessoryView的UIMenuController中隐藏’select’,’selectAll’,’paste’?,第1张

概述我正在开发一个支持在UITextView中编辑attributesText的应用程序.为了向用户提供格式化输入的工具,我使用inputAccessoryView来增强键盘的选项,如项目符号列表,编号列表,缩进,outdent,字体控件(粗体,下划线,增加字体大小,减小字体大小)等这太多了,无法放在inputAccessoryView上,所以我希望使用UIMenuController提供一种机制,为 我正在开发一个支持在UITextVIEw中编辑attributesText的应用程序.为了向用户提供格式化输入的工具,我使用inputAccessoryVIEw来增强键盘的选项,如项目符号列表,编号列表,缩进,outdent,字体控件(粗体,下划线,增加字体大小,减小字体大小)等这太多了,无法放在inputAccessoryVIEw上,所以我希望使用UIMenuController提供一种机制,为用户提供更多空间让他们知道他们的意图.

所以,我有一个带有’ListAccessory’按钮的inputAccessoryVIEw.按下它时,我想显示一个带有四个选项的UIMenuController(项目符号,数字,增加缩进,减少缩进).但是当我显示这个菜单时,它还包括’select’,’selectAll’和’paste’.

我没有在我的视图中定义的任何这些方法(select:,selectAll:或paste:在UIResponderStandardEditactions非正式协议中定义).我已经定义了canPerformAction:withSender:并且只对我的选择器响应’YES’.

- (BOol) canPerformAction:(SEL)selector withSender:(ID) sender{    DDLogInfo(@"canPerformAction: %@",NsstringFromSelector(selector));    if (selector == @selector(formatAsBulletList:)) return YES;    if (selector == @selector(formatAsNumberedList:)) return YES;    if (selector == @selector(formatIncreaseIndent:)) return YES;    if (selector == @selector(formatDecreaseIndent:)) return YES;    return NO; // return [super canPerformAction:selector withSender:sender];}

当我记录在这段代码中调用的选择器时,我没有看到任何’select:’,’selectAll:’或’paste:’的请求,所以我相信UIMenuController代码正在测试那些直接调用的方法toCerformSelector()对类.

由于我没有在我的vIEwController中实现这些函数(从UItableVIEwController派生),我只能相信UIMenuController正在查找响应者链并且看到最初启动键盘的响应者是UITextVIEw,它支持select,selectAll,并粘贴.

所以我有几个问题:

1)是我对情况的理解吗?

2)如何强制不显示这些菜单项?我能以某种方式暂时打破响应者链而不解雇键盘吗?

解决方法 很酷的问题.问题就在于你理解它.当你尝试调用菜单时,UITextVIEw是第一个响应者,因此它使用Select和Select All *** 作填充菜单

一个解决方案是子类UITextVIEw并添加一个额外的属性,允许您简单地阻止项目.

我尝试了这个,它可以在UITextFIEld上运行,因为它是我必须提供的但是没有理由相信它不适用于UITextVIEw

轻轻地对您的视图进行子类化.

@interface CharlIEDevTextVIEw : UITextVIEw@property BOol blockActionMenu;@end

@implementation CharlIEDevTextVIEw-(BOol)canPerformAction:(SEL)action withSender:(ID)sender {    if (self.blockActionMenu) {        return NO;    }    return [super canPerformAction:action withSender:sender];}@end

然后当你构建菜单时(假设你有一个IBOutlet到textvIEw)

-(voID)yellowMellow:(ID)sender {}-(voID)createMenuForbutton:(UIbutton *)sender{    UIMenuItem *newInstanceItem = [[UIMenuItem alloc] initWithTitle:@"Woot" action:@selector(yellowMellow:)];    [UIMenuController sharedMenuController].menuItems = @[newInstanceItem];    CGPoint apoint = sender.center;    self.charlIETextVIEw.blockActionMenu = YES;    [[UIMenuController sharedMenuController] setTargetRect:CGRectMake(apoint.x,apoint.y,0) inVIEw:sender.supervIEw];    [[UIMenuController sharedMenuController] setMenuVisible:YES animated:YES];    self.charlIETextVIEw.blockActionMenu = NO;}

或者,也可以通过UIMenuControllerWillShowMenuNotification和UIMenuControllerDIDHIDeMenuNotification来切换阻止打开和关闭.

并且可能使它稍微不那么难看创建一个委托而不是一个属性.您的视图控制器将是委托和谓词是否即将显示菜单或注意到菜单已被解除.

基本相同的效果,不同的模式.

@protocol CharlIETextVIEwMenuDelegate <NSObject>-(BOol)shouldBlockMenu;@end@interface CharlIETextVIEw : UITextVIEw@property (nonatomic,weak) ID< CharlIETextVIEwMenuDelegate> menuDelegate;@end@implementation CharlIEDevTextVIEw-(BOol)canPerformAction:(SEL)action withSender:(ID)sender {    if ([self.menuDelegate shouldBlockMenu]) {        return NO;    }    return [super canPerformAction:action withSender:sender];}@end
总结

以上是内存溢出为你收集整理的ios – 在显示附加到inputAccessoryView的UIMenuController中隐藏’select’,’selectAll’,’paste’?全部内容,希望文章能够帮你解决ios – 在显示附加到inputAccessoryView的UIMenuController中隐藏’select’,’selectAll’,’paste’?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1021982.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存