gpt4 book ai didi

ios - 在显示附加到 inputAccessoryView 的 UIMenuController 中隐藏 'select' 、 'selectAll' 、 'paste' ?

转载 作者:可可西里 更新时间:2023-11-01 06:09:38 25 4
gpt4 key购买 nike

我正在开发一个支持在 UITextView 中编辑属性文本的应用程序。为了向用户提供格式化输入的工具,我使用 inputAccessoryView 来增加键盘的选项,例如项目符号列表、编号列表、缩进、取消缩进、字体控制(粗体、下划线、增加字体大小、减小字体大小)等. 这对于 inputAccessoryView 来说太多了,所以我希望使用 UIMenuController 来提供一种机制,为用户提供更多空间来表达他们的意图。

因此,我有一个带有“listAccessory”按钮的 inputAccessoryView。按下时,我想显示一个带有四个选项(项目符号、数字、增加缩进、减少缩进)的 UIMenuController。但是当我显示这个菜单时,它还包括“选择”、“全选”和“粘贴”。

我没有在我的 View 中定义任何这些方法(select:、selectAll: 或 paste: 在 UIResponderStandardEditActions 非正式协议(protocol)中定义)。我已经定义了 canPerformAction:withSender: 并且只为我的选择器响应"is"。

- (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 代码正在测试这些方法直接调用 canPerformSelector() 针对类。

因为我没有在我的 viewController(派生自 UITableViewController)中实现这些功能,我只能相信 UIMenuController 正在查找响应者链并看到最初启动键盘的响应者是一个 UITextView,它确实支持选择、全选和粘贴。

所以我有几个问题:

1) 我对情况的理解正确吗?

2) 如何强制不显示这些菜单项?我能否在不关闭键盘的情况下以某种方式暂时中断响应链?

最佳答案

很酷的问题。问题出在您的理解上。当您尝试调用菜单时,UITextView 是第一响应者,因此它会使用 SelectSelect All< 填充菜单 Action

一个解决方案是子类化 UITextView 并添加一个额外的属性,允许您短暂地阻止项目。

我试过了,它在 UITextField 上工作,因为它是我必须提交的,但没有理由相信它不会在 UITextView 上工作

轻松地对您的 View 进行子类化。

@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, 0) inView:sender.superview];

[[UIMenuController sharedMenuController] setMenuVisible:YES animated:YES];

self.charlieTextView.blockActionMenu = NO;
}

或者听取 UIMenuControllerWillShowMenuNotificationUIMenuControllerDidHideMenuNotification 以打开和关闭阻止。

并且可能为了让它稍微不那么难看,创建一个委托(delegate)而不是一个属性。您的 View Controller 将成为委托(delegate)并判断它是要显示菜单还是注意到菜单已被取消。

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

@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' ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20001798/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com