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 成为第一响应者?