在UITableViewCell中,我使用以下方法在长按下显示菜单。
我需要传递一个值按下删除菜单项-(无效)numberDelete方法。
-(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;
}发布于 2014-07-14 05:34:08
如此简单,只需创建一个类型为UIMenuItem的类,在其中添加属性,并使用您的UIMenuItem class而不是实际的UIMenuItem。看看怎么做。
创建一个类,比如MyMenuItem of type UIMenuItem。
MyMenuItem.h
#import <UIKit/UIKit.h>
@interface MyMenuItem : UIMenuItem
@property(nonatomic, strong)NSIndexPath *indexPath;
@endMyMenuItem.m
#import "MyMenuItem.h"
@implementation MyMenuItem
@end然后
{
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);
}希望能帮上忙。
干杯。
发布于 2018-05-15 09:30:19
Swift 4中接受答案的修正版本
MenuItemWithIndexPath.swift:
class MenuItemWithIndexPath: UIMenuItem {
var indexPath: IndexPath?
init(title: String, action: Selector, indexPath: IndexPath) {
super.init(title: title, action: action)
self.indexPath = indexPath
}
}用法:
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)")
}
}发布于 2020-02-28 10:31:22
我用这种方式解决了这类问题:
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”,希望能帮上忙。
https://stackoverflow.com/questions/24729707
复制相似问题