どうやらかつては簡単な方法複数のカスタムメニュー項目を追加したときに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;
}