UIMenuControllerからコピーを本当に削除するにはどうすればいいですか?質問する

UIMenuControllerからコピーを本当に削除するにはどうすればいいですか?質問する

どうやらかつては簡単な方法複数のカスタムメニュー項目を追加したときにUIMenuControllerに「その他...」ラベルが表示されないようにするには、システムメニュー項目をすべて削除するだけです。回避策はこちらコピーが機能し続けるようにするには、別のセレクターを使用してカスタム コピー コマンドを実装し、canPerformAction:withSender: をオーバーライドしてシステム コピーを表示しないようにするだけです。

-(BOOL)canPerformAction:(SEL)action withSender:(id)sender 
{
    if (action == @selector(copy:))
       return NO;
    else
       // logic to show or hide other things
}

残念ながら、このメソッドはもう機能しません (少なくとも UIWebView サブクラスでは)。canPerformAction:withSender: は copy: を除くすべてのシステム メニュー項目に対して呼び出されるため、結果としてシステム コピー メニュー項目が常に表示されます。つまり、カスタム メニュー項目が複数ある場合、それらは常に「その他...」の後ろに隠れます。

では、システムのコピー項目を本当に削除する方法、またはメニュー項目が「その他...」の背後に隠れないようにする別の方法はあるのでしょうか?

アップデート

これは、canPerformAction:withSender をオーバーライドしたときに得られる出力です。このメソッドは "copy:" アクションに対して呼び出されないことに注意してください。

cannot perform action cut: with sender <UIMenuController: 0x7227d30>.
cannot perform action select: with sender <UIMenuController: 0x7227d30>.
cannot perform action selectAll: with sender <UIMenuController: 0x7227d30>.
cannot perform action paste: with sender <UIMenuController: 0x7227d30>.
cannot perform action delete: with sender <UIMenuController: 0x7227d30>.
cannot perform action promptForReplace: with sender <UIMenuController: 0x7227d30>.
cannot perform action _showMoreItems: with sender <UIMenuController: 0x7227d30>.
cannot perform action _setRtoLTextDirection: with sender <UIMenuController: 0x7227d30>.
cannot perform action _setLtoRTextDirection: with sender <UIMenuController: 0x7227d30>.
can perform action customCopy: with sender <UIMenuController: 0x7227d30>.
can perform action custom1: with sender <UIMenuController: 0x7227d30>.
cannot perform action custom2: with sender <UIMenuController: 0x7227d30>.
can perform action custom3: with sender <UIMenuController: 0x7227d30>.
can perform action custom4: with sender <UIMenuController: 0x7227d30>.
cannot perform action cut: with sender <UIMenuController: 0x7227d30>.
cannot perform action select: with sender <UIMenuController: 0x7227d30>.
cannot perform action selectAll: with sender <UIMenuController: 0x7227d30>.
cannot perform action paste: with sender <UIMenuController: 0x7227d30>.
cannot perform action delete: with sender <UIMenuController: 0x7227d30>.
cannot perform action promptForReplace: with sender <UIMenuController: 0x7227d30>.
cannot perform action _showMoreItems: with sender <UIMenuController: 0x7227d30>.
cannot perform action _setRtoLTextDirection: with sender <UIMenuController: 0x7227d30>.
cannot perform action _setLtoRTextDirection: with sender <UIMenuController: 0x7227d30>.

ベストアンサー1

リンク先のテクニックはまだ機能しているようです。UIWebViewこれらのメソッドを使用してサブクラスを実装したところ、A 項目と B 項目のみが表示されました。

+ (void)initialize
{
    UIMenuItem *itemA = [[UIMenuItem alloc] initWithTitle:@"A" action:@selector(a:)];
    UIMenuItem *itemB = [[UIMenuItem alloc] initWithTitle:@"B" action:@selector(b:)];
    [[UIMenuController sharedMenuController] setMenuItems:[NSArray arrayWithObjects:itemA, itemB, nil]];
    [itemA release];
    [itemB release];
}

- (BOOL)canPerformAction:(SEL)action withSender:(id)sender
{
    BOOL can = [super canPerformAction:action withSender:sender];
    if (action == @selector(a:) || action == @selector(b:))
    {
        can = YES;
    }
    if (action == @selector(copy:))
    {
        can = NO;
    }
    NSLog(@"%@ perform action %@ with sender %@.", can ? @"can" : @"cannot", NSStringFromSelector(action), sender);
    return can;
}

おすすめ記事