UITableViewCell 不会成为第一响应者(在单元格手势上显示 UIMenuController)

Posted

技术标签:

【中文标题】UITableViewCell 不会成为第一响应者(在单元格手势上显示 UIMenuController)【英文标题】:UITableViewCell won't become first responder (Showing UIMenuController on cell gesture) 【发布时间】:2012-12-03 08:28:21 【问题描述】:

我有一个带有UITabBar 的应用程序。每个标签都是一个UINavigationController,里面有几个UIViewControllers。其中一个视图控制器包含一个UITableView,我想显示一个浮动菜单来删除长按的UITableViewCell

我正在使用UIMenuController,但它没有显示,因为单元格拒绝成为第一响应者。

这是我的代码:

    - (void)viewDidLoad
    
        [super viewDidLoad];

        UILongPressGestureRecognizer *lpgr = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleLongPress:)];
        lpgr.minimumPressDuration = 1.0; //second
        [table addGestureRecognizer:lpgr];

        [lpgr release];
    

-(void)handleLongPress:(UILongPressGestureRecognizer *)gestureRecognizer 
    if (gestureRecognizer.state == UIGestureRecognizerStateBegan) 
        CGPoint p = [gestureRecognizer locationInView: table];

        NSIndexPath *indexPath = [table indexPathForRowAtPoint:p];
        if (indexPath != nil) 
            UITableViewCell* cell = [self tableView:table cellForRowAtIndexPath: indexPath];

            [cell becomeFirstResponder];
            UIMenuItem *delete = [[UIMenuItem alloc] initWithTitle:@"Delete" action:@selector(delete:)];

            UIMenuController *menu = [UIMenuController sharedMenuController];
            [menu setMenuItems:[NSArray arrayWithObjects:delete, nil]];
            [menu setTargetRect:cell.frame inView:cell.superview];
            [menu setMenuVisible:YES animated:YES];
        
    

在 UITableViewCell 上我重写了方法:

-(BOOL) canBecomeFirstResponder 
    return YES;

关于为什么细胞没有成为第一响应者的任何想法?

谢谢!

【问题讨论】:

你能告诉我为什么它必须成为第一响应者吗?无论如何,第一响应者应该是添加在单元格顶部的菜单! @imthi 我读到它需要成为第一响应者才能显示菜单。无论如何我的问题是菜单没有显示,只是我认为它与谁是第一响应者有关 【参考方案1】:

我想我修复了你的代码 :-)

-(void)handleLongPress:(UILongPressGestureRecognizer *)gestureRecognizer 
    if (gestureRecognizer.state == UIGestureRecognizerStateBegan) 
        CGPoint p = [gestureRecognizer locationInView: self.tableView];
        NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:p];
        if (indexPath != nil) 

            [self becomeFirstResponder];
            UIMenuItem *delete = [[UIMenuItem alloc] initWithTitle:@"Delete" action:@selector(customDelete:)];

            UIMenuController *menu = [UIMenuController sharedMenuController];
            [menu setMenuItems:[NSArray arrayWithObjects:delete, nil]];
            [menu setTargetRect:[self.tableView rectForRowAtIndexPath:indexPath] inView:self.tableView];
            [menu setMenuVisible:YES animated:YES];
        
    


- (void)customDelete:(id)sender 
//


- (BOOL)canBecomeFirstResponder 
    return YES;


- (BOOL)canPerformAction:(SEL)action withSender:(id)sender 
    if (action == @selector(customDelete:) )
        return YES;
    
    return NO;

我做了以下..

    [自己成为FirstResponder]; [菜单 setTargetRect:[self.tableView rectForRowAtIndexPath:indexPath] inView:self.tableView]; 为 canPerformAction 添加了 true 如果您已实现该功能,则通常不需要

请将表格视图和其他内容更改为您的本地引用变量:-)

好书 - http://www.intridea.com/blog/2010/12/22/developers-notes-for-uimenucontroller

【讨论】:

谢谢伙计,太好了! ;-)

以上是关于UITableViewCell 不会成为第一响应者(在单元格手势上显示 UIMenuController)的主要内容,如果未能解决你的问题,请参考以下文章

如果通过附件视图添加到 UITableViewCell,UITextField 无法成为第一响应者

如果单元格是第一响应者并且不在屏幕上,则 UITableViewCell setEditing:animated 不会被调用

带有 TextField 和第一响应者的自定义 UITableViewCell

如何使表格单元格中的 UITextField 成为第一响应者?

如何在表格单元格中创建UITextField成为第一响应者?

NSTextView 不会成为第一响应者