gpt4 book ai didi

iphone - UIMenuController 隐藏键盘

转载 作者:行者123 更新时间:2023-12-03 18:41:32 33 4
gpt4 key购买 nike

我目前有一个用于聊天的应用程序。我使用 UItextField 作为输入框,使用气泡来显示消息,比如系统短信。我想在消息气泡(标签)上启用复制粘贴。问题是,当我想显示 UIMenuController 时,我需要复制的标签需要成为第一响应者。如果当前显示键盘,当标签成为第一响应者时,文本字段将失去焦点,从而键盘将自动隐藏。这会导致 UI 滚动,感觉不太好。即使我需要显示菜单,我是否也可以保持键盘显示?

enter image description here

enter image description here

最佳答案

对于那些仍在寻找答案的人来说,这里是代码(主要思想属于 neon1,请参阅链接的问题)。

这个想法如下:如果响应者不知道如何处理给定的操作,它会将其传播给链中的下一个响应者。到目前为止,我们有两名急救人员候选人:

  1. 单元格
  2. 文本字段

它们每个都有独立的响应者链(事实上,不,它们确实有共同的祖先,所以它们的链有一些共同点,但我们不能使用它):

UITextField <- UIView <- ... <- UIWindow <- UIApplication
UITableViewCell <- UIView <- ... <- UIWindow <- UIApplication

所以我们希望有以下响应链:

UITextField <- UITableViewCell <- ..... <- UIWindow <- UIApplication

我们需要子类化 UITextField (代码取自 here ):

CustomResponderTextView.h

@interface CustomResponderTextView : UITextView
@property (nonatomic, weak) UIResponder *overrideNextResponder;
@end

CustomResponderTextView.m

@implementation CustomResponderTextView

@synthesize overrideNextResponder;

- (UIResponder *)nextResponder {
if (overrideNextResponder != nil)
return overrideNextResponder;
else
return [super nextResponder];
}

@end

这段代码非常简单:如果我们没有设置任何自定义的下一个响应者,它会返回真正的响应者,否则返回我们的自定义响应者。

现在我们可以在代码中设置新的响应者(我的示例添加自定义操作):

CustomCell.m

@implementation CustomCell
- (BOOL) canBecomeFirstResponder {
return YES;
}

- (BOOL)canPerformAction:(SEL)action withSender:(id)sender {
return (action == @selector(copyMessage:) || action == @selector(deleteMessage:));
}
@end

- (void) copyMessage:(id)sender {
// copy logic here
}

- (void) deleteMessage:(id)sender {
// delete logic here
}

Controller

- (void) viewDidLoad {
...
UIMenuItem *copyItem = [[UIMenuItem alloc] initWithTitle:@"Custom copy" action:@selector(copyMessage:)];
UIMenuItem *deleteItem = [[UIMenuItem alloc] initWithTitle:@"Custom delete" action:@selector(deleteMessage:)];
UIMenuController *menu = [UIMenuController sharedMenuController];
[menu setMenuItems:@[copyItem, deleteItem]];
...
}

- (void) longCellTap {
// cell is UITableViewCell, that has received tap
if ([self.textField isFirstResponder]) {
self.messageTextView.overrideNextResponder = cell;
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(menuDidHide:) name:UIMenuControllerDidHideMenuNotification object:nil];
} else {
[cell becomeFirstResponder];
}
}

- (void)menuDidHide:(NSNotification*)notification {
self.messageTextView.overrideNextResponder = nil;
[[NSNotificationCenter defaultCenter] removeObserver:self name:UIMenuControllerDidHideMenuNotification object:nil];
}

最后一步是让第一响应者(在我们的例子中是文本字段)将 copyMessage:deleteMessage: 操作传播给下一个响应者(在我们的例子中是单元格)。正如我们所知,iOs 发送 canPerformAction:withSender: 来了解给定的响应者是否可以处理该操作。

我们需要修改CustomResponderTextView.m并添加以下函数:

CustomResponderTextView.m

...
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender {
if (overrideNextResponder != nil)
return NO;
else
return [super canPerformAction:action withSender:sender];
}
...

如果我们设置了自定义的下一个响应程序,我们会将所有操作发送给它(如果您需要在文本字段上执行一些操作,您可以修改这部分),否则我们会询问我们的父类(super class)型是否可以处理它。

关于iphone - UIMenuController 隐藏键盘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13601643/

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