长按会显示复制的一个快捷菜单,如图:
首先要定义快捷菜单显示的内容以及对应的selector,oschina客户端在AppDelegate里定义如下:
UIMenuController *menuController = [UIMenuController sharedMenuController];
[menuController setMenuVisible:YES animated:YES];
[menuController setMenuItems:@[
[[UIMenuItem alloc] initWithTitle:@"复制" action:NSSelectorFromString(@"copyText:")],
[[UIMenuItem alloc] initWithTitle:@"删除" action:NSSelectorFromString(@"deleteObject:")]
]];
定义了两个快捷菜单复制和删除。
然后在UITableViewCell里
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender
{
return _canPerformAction(self, action);
}
- (BOOL)canBecomeFirstResponder
{
return YES;
}
- (void)copyText:(id)sender
{
UIPasteboard *pasteBoard = [UIPasteboard generalPasteboard];
[pasteBoard setString:_contentLabel.text];
}
- (void)deleteObject:(id)sender
{
_deleteObject(self);
}
可以直接把第一个函数改写为,这样好理解,他那么写是还有其他操作:
return action==@selector(copyText:);
我们这里只相应复制的菜单。
然后在UIViewController里需要实现以下方法:
- (BOOL)tableView:(UITableView *)tableView shouldShowMenuForRowAtIndexPath:(NSIndexPath *)indexPath
{
return YES;
}
- (BOOL)tableView:(UITableView *)tableView canPerformAction:(SEL)action forRowAtIndexPath:(NSIndexPath *)indexPath withSender:(id)sender
{
return action == @selector(copyText:);
}
- (void)tableView:(UITableView *)tableView performAction:(SEL)action forRowAtIndexPath:(NSIndexPath *)indexPath withSender:(id)sender {
// required
}
这样长按就会出现复制菜单,点击复制会调用UITableViewCell里定义的copyText:方法。