- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前有一个用于聊天的应用程序。我使用 UItextField 作为输入框,使用气泡来显示消息,比如系统短信。我想在消息气泡(标签)上启用复制粘贴。问题是,当我想显示 UIMenuController 时,我需要复制的标签需要成为第一响应者。如果当前显示键盘,当标签成为第一响应者时,文本字段将失去焦点,从而键盘将自动隐藏。这会导致 UI 滚动,感觉不太好。即使我需要显示菜单,我是否也可以保持键盘显示?
最佳答案
对于那些仍在寻找答案的人来说,这里是代码(主要思想属于 neon1,请参阅链接的问题)。
这个想法如下:如果响应者不知道如何处理给定的操作,它会将其传播给链中的下一个响应者。到目前为止,我们有两名急救人员候选人:
它们每个都有独立的响应者链(事实上,不,它们确实有共同的祖先,所以它们的链有一些共同点,但我们不能使用它):
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/
UIMenuController 使用的 UIMenuItem 是否可以在即将弹出时更改其标题? 例如,当我允许 override func canPerformAction(action: Sele
想要隐藏显示剪切、复制、粘贴、选择、全选菜单的UIMenuController。 谁都知道怎么做 最佳答案 UIMenuController 的文档可在此处找到 http://developer.ap
我在长按和双击手势上显示 UIMenuController,但它没有显示。我已按照此处给出的答案进行操作,但它仍然没有出现。 UIMenuController not showing up 下面是我的
我目前有一个用于聊天的应用程序。我使用 UItextField 作为输入框,使用气泡来显示消息,比如系统短信。我想在消息气泡(标签)上启用复制粘贴。问题是,当我想显示 UIMenuController
您好,我想在 iPhone SDK3.x 中创建一个自定义气泡菜单,例如剪切/复制/粘贴菜单。我知道它是 UIMenuController 但它只提供标准的剪切/复制/粘贴菜单。任何人都知道如何制作类
我有一个 UIMenuController在 Collection View 单元格顶部有一个“删除”菜单项,当用户长按第 1 节的单元格时显示该菜单项: @IBAction func handleL
我已经使用 TextKit 实现了自定义 TextView 。另外,我还使用 UILongPressGesture 实现了自定义文本选择。我在使用标准弹出菜单 UIMenuController 复制选
有没有办法在 iOS 中向 UIMenuItem 添加自定义图像?它必须看起来像在 Android 中(下面的图像 + 文本)。可能有完整的自定义 Controller ?提前致谢。 最佳答案 是的,
我刚刚找到关于 UIMenuController 但不知道什么时候使用它?如果我创建 UITextField,看起来这个文本字段已经内置了 UIMenuController(因为我可以选择、编辑等)。
我是 iOS 的新手。我正在尝试显示一个弹出菜单,但我无法显示菜单。请帮忙。这是我的代码: //DidLoad function to initialize UILongPRessGestureRec
早上好! 我正在编写一个显示商店列表的应用程序,每个商店可以销售 2 种产品和/或可以是在线商店。 为了在我的应用程序上显示这个,我添加了一些“图标”,但如果它们不够“不言自明”,我正在寻找一种易于使
我有 UITextView,我想在其上添加突出显示作为自定义菜单项。我已注册到以下通知 UIMenuControllerWillShowMenuNotification。 通知的方法是这样的: if
我已经将 UIWebView 子类化以在其中添加自定义 UIMenuController 功能,它在 iOS 9 之前一直运行良好。我不确定发生了什么变化,但现在我遇到了这样一种情况,当我点击一个链接
我在 UIWebView 中创建了一个自定义的 UIMenuController 但之后它似乎摆脱了 UIMenuController 中的“Speak Selection”选项.说话选择选项在所有测
Apple 的消息应用程序以及许多其他第三方应用程序都支持使用 UIMenuController 样式的弹出窗口来选择消息。 但是,在浏览the documentation好像只用于文本相关的选择。
我创建了一个 UIMenuController 并将其设置为自定义菜单项,如下所示: UIMenuController *menuController = [UIMenuController shar
我正在尝试创建一个自定义 UIMenuController 并将其显示在我的 View 中。这是我的代码: UIMenuController *menuController = [UIMenuCont
我实际上对 iOS7 中用于在 UITableView 上显示自定义上下文菜单的更改感到有些困惑。 我的代码如下: - (void)viewDidLoad { UIMenuItem *delet
当用户在 UITextView 或 UIWebView 中选择某些文本时,将显示 UIMenuController。有没有办法以编程方式访问此选定的文本? 我需要它,因为我想将自定义项目添加到 UIM
我需要在我的应用程序中使用 uimenucontroller,当我移动 uiviewcontroller 中存在的任何选定的 uiview/uiimageView 时,我需要复制/粘贴/等选项。 这是
我是一名优秀的程序员,十分优秀!