首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >显示UIMenuController丢失键盘

显示UIMenuController丢失键盘
EN

Stack Overflow用户
提问于 2011-12-05 10:25:01
回答 2查看 2.6K关注 0票数 7

我正在制作一个iphone应用程序,类似于手机上的消息应用程序。我刚刚设置了通过UIMenuController复制消息的功能,但是如果键盘正在显示,而有人试图复制消息,键盘就会消失(可能是因为我的[cell becomeFirstResponder];,其中cell是被复制的消息单元格)。

有没有一种方法可以在不丢失键盘的情况下显示复制消息?

代码语言:javascript
复制
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:
(NSIndexPath *)indexPath {

    //...other cell setup stuff...

    UILongPressGestureRecognizer *longPressGesture =
    [[UILongPressGestureRecognizer alloc]
      initWithTarget:self action:@selector(showCopyDialog:)];
    [cell addGestureRecognizer:longPressGesture];

    return cell;
}

- (void)showCopyDialog:(UILongPressGestureRecognizer *)gesture
{
    if (gesture.state == UIGestureRecognizerStateBegan)
    {
        ConvoMessageCell *cell = (ConvoMessageCell *)[gesture view];
        NSIndexPath *indexPath = [self.tblConvo indexPathForCell:cell];

        UIMenuController *theMenu = [UIMenuController sharedMenuController];
        [cell becomeFirstResponder];
        [theMenu setTargetRect:CGRectMake(menuX, menuY, 100, 100) inView:cell];
        [theMenu setMenuVisible:YES animated:YES];        
    }
}
EN

回答 2

Stack Overflow用户

发布于 2012-11-11 02:04:12

我通过将UITextView子类化来提供覆盖nextResponder和禁用内置操作(粘贴)的方法来解决这个难题,如下所示:

代码语言:javascript
复制
@interface CustomResponderTextView : UITextView

@property (nonatomic, weak) UIResponder *overrideNextResponder;

@end

代码语言:javascript
复制
@implementation CustomResponderTextView

@synthesize overrideNextResponder;

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

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

@end

然后,在手势操作处理程序中,检查文本视图是否已经是第一个响应者。如果是这样,让它覆盖下一个响应器;否则,键盘可能无论如何都是隐藏的,您可以简单地使用becomeFirstResponder。当菜单隐藏时,您还必须重置覆盖:

代码语言:javascript
复制
if ([inputView isFirstResponder]) {
    inputView.overrideNextResponder = self;
    [[NSNotificationCenter defaultCenter] addObserver:self
        selector:@selector(menuDidHide:)
        name:UIMenuControllerDidHideMenuNotification object:nil];
} else {
    [self becomeFirstResponder];
}

- (void)menuDidHide:(NSNotification*)notification {

    inputView.overrideNextResponder = nil;
    [[NSNotificationCenter defaultCenter] removeObserver:self
        name:UIMenuControllerDidHideMenuNotification object:nil];
}

使用iOS 5中引入的表视图委托方法(shouldShowMenuForRowAtIndexPath等)这对我来说不是一个解决方案,因为我需要控制菜单的位置(默认情况下,它只是在单元格上水平居中,但我正在显示消息气泡,并希望菜单位于实际气泡的中心)。

票数 17
EN

Stack Overflow用户

发布于 2012-03-03 06:14:20

在iOS 5中,您现在可以使用表视图委托方法来显示菜单控制器:

代码语言:javascript
复制
- (BOOL) tableView:(UITableView *)tableView shouldShowMenuForRowAtIndexPath:(NSIndexPath *)indexPath

- (BOOL)tableView:(UITableView *)tableView canPerformAction:(SEL)action forRowAtIndexPath:(NSIndexPath *)indexPath withSender:(id)sender;

- (void)tableView:(UITableView *)tableView performAction:(SEL)action forRowAtIndexPath:(NSIndexPath *)indexPath withSender:(id)sender;

以这种方式显示菜单控制器不会使键盘失效。

我仍然对此感到好奇,因为我有一个支持iOS5之前版本的应用程序,我也想做你说的事情(当出现复制菜单时,不会退出键盘)。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8380373

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档