25

UITableViewCell を長押ししてカスタム UIMenuItems を表示するとポップアップする UIMenuController が必要です。

カスタムアイテムをviewDidLoadに設定しました

UIMenuItem *testMenuItem = [[UIMenuItem alloc] initWithTitle:@"Test" action:@selector(test:)];
[[UIMenuController sharedMenuController] setMenuItems: @[testMenuItem]];

そして、適切なデリゲート メソッドをすべて設定しました。

- (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(copy:) || action == @selector(test:));
}

- (BOOL)tableView:(UITableView *)tableView performAction:(SEL)action forRowAtIndexPath:(NSIndexPath *)indexPath withSender:(id)sender {
    if (action == @selector(copy:)) {
         // do stuff
    }

    return YES;
}

ただし、「コピー」アイテムとカスタムアイテムのみを許可するため、「コピー」アイテムを表示するだけです。ただし、カスタム アイテムは表示されません。

ジェスチャ認識機能をセル自体に追加することもできますが、それは UIMenuController の共有インスタンスの目的を無効にしますね。

4

4 に答える 4

52

私が理解している限り、2つの主な問題があります。

tableView canPerformAction:1)カスタム セレクターをサポートすることを期待しているが、ドキュメントにはUIResponderStandardEditActions(コピーおよび/または貼り付け) の 2 つしかサポートしていないと記載されています。

2)プロパティ|| action == @selector(test:)を初期化してカスタム メニュー オプションを追加しているため、パーツは必要ありません。menuItemsこの項目セレクターの場合、チェックは自動的に行われます。

カスタムメニュー項目を表示して機能させるためにできることは次のとおりです。

1) テーブル ビューのデリゲート メソッドを次のように修正します。

a)

UIMenuItem *testMenuItem = [[UIMenuItem alloc] initWithTitle:@"Test" action:@selector(test:)];
[[UIMenuController sharedMenuController] setMenuItems: @[testMenuItem]];
[[UIMenuController sharedMenuController] update];

b)

- (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(copy:));
}

- (void)tableView:(UITableView *)tableView performAction:(SEL)action forRowAtIndexPath:(NSIndexPath *)indexPath withSender:(id)sender {
    // required
}

2)セル(サブクラス化UITableViewCell)をセットアップします

-(BOOL) canPerformAction:(SEL)action withSender:(id)sender {
    return (action == @selector(copy:) || action == @selector(test:));
}

-(BOOL)canBecomeFirstResponder {
    return YES;
}

/// this methods will be called for the cell menu items
-(void) test: (id) sender {

}

-(void) copy:(id)sender {

}
///////////////////////////////////////////////////////
于 2012-09-05T23:44:58.517 に答える
8

UITableViewCell のコピーとカスタム アクションを実装するには:

アプリケーションに入ったら、カスタム アクションを登録します。

struct Token { static var token: dispatch_once_t = 0 }
dispatch_once(&Token.token) {
    let customMenuItem = UIMenuItem(title: "Custom", action: #selector(MyCell.customMenuItemTapped(_:))
    UIMenuController.sharedMenuController().menuItems = [customMenuItem]
    UIMenuController.sharedMenuController().update()
}

UITableViewCellサブクラスで、カスタム メソッドを実装します。

func customMenuItemTapped(sender: UIMenuController) {
    // implement custom action here
}

UITableViewDelegateで、次のメソッドを実装します。

override func tableView(tableView: UITableView, shouldShowMenuForRowAtIndexPath indexPath: NSIndexPath) -> Bool {
    return true
}

override func tableView(tableView: UITableView, canPerformAction action: Selector, forRowAtIndexPath indexPath: NSIndexPath, withSender sender: AnyObject?) -> Bool {
    return action == #selector(NSObject.copy(_:)) || action == #selector(MyCell.customMenuItemTapped(_:))
}

override func tableView(tableView: UITableView, performAction action: Selector, forRowAtIndexPath indexPath: NSIndexPath, withSender sender: AnyObject?) {
    switch action {
    case #selector(NSObject.copy(_:)):
        // implement copy here
    default:
        assertionFailure()
    }
}

ノート:

于 2015-07-11T14:59:49.793 に答える