首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过UIMenuItem of UIMenuController传递值

通过UIMenuItem of UIMenuController传递值
EN

Stack Overflow用户
提问于 2014-07-14 04:51:24
回答 3查看 2.1K关注 0票数 4

在UITableViewCell中,我使用以下方法在长按下显示菜单。

我需要传递一个值按下删除菜单项-(无效)numberDelete方法。

代码语言:javascript
复制
-(void)handleLongPress:(UILongPressGestureRecognizer *)gestureRecognizer {

    if(gestureRecognizer.state == UIGestureRecognizerStateBegan) {

        CGPoint p = [gestureRecognizer locationInView: self.pullTableView];
        NSIndexPath *indexPath = [self.pullTableView indexPathForRowAtPoint:p];
        if(indexPath != nil) {

            [self becomeFirstResponder];
            NSInteger *row = indexPath.row;

            //need to pass this row value through @selector(numberDelete:)

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

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

    }

}

-(void)numberDelete:(id)sender {
   //receive value of row here
}

-(BOOL)canBecomeFirstResponder {
    return YES;
}

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

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-07-14 05:34:08

如此简单,只需创建一个类型为UIMenuItem的类,在其中添加属性,并使用您的UIMenuItem class而不是实际的UIMenuItem。看看怎么做。

创建一个类,比如MyMenuItem of type UIMenuItem

MyMenuItem.h

代码语言:javascript
复制
#import <UIKit/UIKit.h>

@interface MyMenuItem : UIMenuItem
@property(nonatomic, strong)NSIndexPath *indexPath;
@end

MyMenuItem.m

代码语言:javascript
复制
#import "MyMenuItem.h"

@implementation MyMenuItem

@end

然后

代码语言:javascript
复制
{
    MyMenuItem *deleteMenuItem = [[MyMenuItem alloc] initWithTitle:@"Delete" action:@selector(numberDelete:)];
    deleteMenuItem.indexPath=indexPath;//Assign to property

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



-(void)numberDelete:(id)sender {
   //receive value of row here. The sender in iOS 7 is an instance of UIMenuController.
   UIMenuController *targetSender = (UIMenuController *)sender ;
   MyMenuItem *menuItem=(MyMenuItem *)[targetSender.menuItems firstObject]; 

   NSLog(@"%d",menuItem.indexPath.row); 
}

希望能帮上忙。

干杯。

票数 4
EN

Stack Overflow用户

发布于 2018-05-15 09:30:19

Swift 4中接受答案的修正版本

MenuItemWithIndexPath.swift:

代码语言:javascript
复制
class MenuItemWithIndexPath: UIMenuItem {
    var indexPath: IndexPath?

    init(title: String, action: Selector, indexPath: IndexPath) {
        super.init(title: title, action: action)
        self.indexPath = indexPath
    }
}

用法:

代码语言:javascript
复制
let menu = UIMenuController.shared
menu.menuItems = [MenuItemWithIndexPath(title: "Delete", action: #selector(numberDelete(sender:)), indexPath: indexPath)]
menu.setTargetRect(tableView.rectForRow(at: indexPath), in: tableView)
menu.setMenuVisible(true, animated: true)


@objc func numberDelete(sender:UIMenuController) {
    if let menuItem = sender.menuItems?.first as? MenuItemWithIndexPath,
        let indexPath = menuItem.indexPath {
        print("delete at indexPath: \(indexPath)")
    }
}
票数 1
EN

Stack Overflow用户

发布于 2020-02-28 10:31:22

我用这种方式解决了这类问题:

代码语言:javascript
复制
 self.becomeFirstResponder()
 let deleteMenuItem = UIMenuItem(title: ConstantString.title_delete, action: #selector(deleteItem(_:)))
 let menuController = UIMenuController.shared
 menuController.menuItems = [deleteMenuItem]
 menuController.accessibilityHint = String(indexPath.row)
 menuController.setMenuVisible(true, animated: true)


@objc func deleteItem(_ sender: UIMenuController) {
     print("delete menu item tapped! index path? \(sender.accessibilityHint)")
}

我用了“飞毛腿4”,希望能帮上忙。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24729707

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档