[[NSNotificationCenterdefaultCenter] addObserver:selfselector:@selector(willHideEditMenu:)name:UIMenuControllerWillHideMenuNotificationobject:nil];
下面监听的几种状态:
UIKIT_EXTERN NSString *const UIMenuControllerWillShowMenuNotification;
UIKIT_EXTERN NSString *const UIMenuControllerDidShowMenuNotification;
UIKIT_EXTERN NSString *const UIMenuControllerWillHideMenuNotification;
UIKIT_EXTERN NSString *const UIMenuControllerDidHideMenuNotification;
UIKIT_EXTERN NSString *const UIMenuControllerMenuFrameDidChangeNotification;
项目中所遇到的问题是长按后出现在的按钮,在到下面的textView(单独写的一个View)上长按时会出现冲突,
现在的解决方法是增加一个BOOL类型的变量,在实现tableViewCell上长按的方法里增加一个UIMenuController的事件监听,
//长按后触发该方法
-(void)longPressCell:(UILongPressGestureRecognizer *)gestureRecognizer
{
[m_dialogView resignFirstResponder];
//判断长按状态
if ([gestureRecognizerstate]==UIGestureRecognizerStateBegan)
{
setMenuControllerValue =YES;
//得到按的cell
InteractionDialogCell *cell = (InteractionDialogCell *)gestureRecognizer.view.superview;
//处理选中问题
[m_tableViewdeselectRowAtIndexPath:[m_tableViewindexPathForSelectedRow] animated:NO];
[m_tableViewselectRowAtIndexPath:[m_tableViewindexPathForCell:cell] animated:NOscrollPosition:UITableViewScrollPositionNone];
//必须设置为第一响应者
[cell becomeFirstResponder];
fileType = cell.m_dialogModel.m_strContentType.intValue;
//得到菜单栏
UIMenuController *menuController = [UIMenuControllersharedMenuController];
[menuController setArrowDirection:UIMenuControllerArrowDown];
[menuController setMenuVisible:NO];
//设置菜单
UIMenuItem *deleteMenuItem = [[UIMenuItemalloc] initWithTitle:@"删除"action:@selector(deleteCell:)];
UIMenuItem *copyMenuItem =[[UIMenuItemalloc] initWithTitle:@"复制"action:@selector(copyCell:)];
if (fileType==0) {
[menuController setMenuItems:[NSArrayarrayWithObjects:deleteMenuItem,copyMenuItem, nil]];
}else
[menuController setMenuItems:[NSArrayarrayWithObjects:deleteMenuItem,nil]];
//设置菜单栏位置
[menuController setTargetRect:cell.m_imgBackground.frameinView:cell];
//显示菜单栏
[menuController setMenuVisible:YESanimated:YES];
[deleteMenuItem release];
[copyMenuItem release];
[[NSNotificationCenterdefaultCenter] addObserver:selfselector:@selector(WillHideMenu:)name:UIMenuControllerWillHideMenuNotificationobject:nil];
}
}
-(void)WillHideMenu:(id)sender
{
setMenuControllerValue =NO;
}
-(void)copyCell:(id)sender
{
InteractionDialogCell * cell=(InteractionDialogCell *)[m_tableViewcellForRowAtIndexPath:[m_tableViewindexPathForSelectedRow]];
UIPasteboard * pasteBoard = [UIPasteboardgeneralPasteboard];
[pasteBoard setString:cell.m_labContent.text];
setMenuControllerValue =NO;
}
-(void)deleteCell:(id)sender
{
InteractionDialogCell * cell=(InteractionDialogCell *)[m_tableViewcellForRowAtIndexPath:[m_tableViewindexPathForSelectedRow]];
[m_Userdb DeleteWithDialogID:cell.m_dialogModel.m_DialogId];
if (cell.m_dialogModel.m_strContentType.intValue==0|| cell.m_dialogModel.m_strContentType.intValue==1||cell.m_dialogModel.m_strContentType.intValue==2) {//文本,音频或者图片,需要删除文件
NSString * filePath;
if (m_isGroupChat) {
filePath=[[InteractionGroupDBgetGroupDir:[GUserSetting provider].UserName] stringByAppendingPathComponent:[HFileSystemToolfilenameAtFullPath:cell.m_dialogModel.m_strFileUrl]];
}
else
filePath=[[InteractionUserDBgetAnotherDir:m_InteractionType me:[GUserSetting provider].UserNameanothreID:m_userId] stringByAppendingPathComponent:[HFileSystemToolfilenameAtFullPath:cell.m_dialogModel.m_strFileUrl]];//文件路径
NSFileManager * mananger=[NSFileManagerdefaultManager];
[mananger removeItemAtPath:filePatherror:nil];
}
[m_tableViewbeginUpdates];
[m_tableViewdeleteRowsAtIndexPaths:[NSMutableArrayarrayWithObject:[m_tableViewindexPathForSelectedRow]] withRowAnimation:UITableViewRowAnimationFade];
[selfsetFooterViewRect];
[m_tableView endUpdates];
}
#pragma mark - UIResponder
//能否更改FirstResponder,一般视图默认为NO,必须重写为YES
- (BOOL)canBecomeFirstResponder
{
return YES;
}
//哪些菜单能够显示
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender
{
if (setMenuControllerValue==NO) {
if (m_dialogView.text.length<=0) {
return (action == @selector(paste:));
}else if (m_dialogView.text.length>0){
return (action == @selector(select:)) ||(action == @selector(selectAll:)) ||(action ==@selector(paste:));
}
//return (action == @selector(select:)) ||(action == @selector(selectAll:)) ||(action == @selector(paste:));
}elseif(setMenuControllerValue==YES){
return (action == @selector(deleteCell:)) ||(action == @selector(copyCell:));
}
return NO;
}
同时在下面的textView(单独写的这个View)中重写
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender;方法。
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender
{
if (m_gtvText.text.length<=0) {
return (action == @selector(paste:));
}else if (m_gtvText.text.length>0){
return (action == @selector(select:)) ||(action == @selector(selectAll:)) ||(action ==@selector(paste:));
}
return NO;
}
测试过也可以在View这个类里不重写这个方法。