UIMenuController的事件监听

[[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这个类里不重写这个方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值