所以,我有一个带有’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’?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)