2

- (void)viewDidLoadビュー コントローラーのメソッドにカスタム メニューを追加しました。

UIMenuItem *menuItem = [[UIMenuItem alloc] initWithTitle:@"Read selected" action:@selector(readSelectedText)];
[UIMenuController sharedMenuController].menuItems = [NSArray arrayWithObject:menuItem];

同じコントローラーで、メソッドも実装します。

- (BOOL)canPerformAction:(SEL)action withSender:(id)sender {
    if (action == @selector(readSelectedText)) {
        if (textView.selectedRange.length > 0) {
            return YES;
        }
        return NO;
    }
    return [super canPerformAction:action withSender:sender];
}

初めてテキストを選択すると、メニューに「選択したものを読む」メニュー項目が含まれ、すべてうまく機能します。ただし、その後のテキスト選択では、メニューにはコピーなどの標準のシステム メニュー項目のみが含まれます。- (BOOL)canPerformAction:(SEL)action withSender:(id)senderメソッドをチェックインしましたが、readSelectedTextアクションで呼び出されることはありません(初めての場合と同様)。

なぜこれが起こるのか分かりますか?

4

3 に答える 3

1

私の解決策はqiufangzhouが提供した提案に基づいているので、クレジットと受け入れられた答えは彼に行きます。

とにかく、私はUIMenuControllerWillShowMenuNotification私の方法でnoriticationを購読することになりましたviewDidLoad

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(menuWillShow) name:UIMenuControllerWillShowMenuNotification object:nil];

次に、このメソッドを実装しました。

-(void)menuWillShow{
    UIMenuItem *menuItem = [[UIMenuItem alloc] initWithTitle:@"Read selected" action:@selector(readSelectedText)];
    [UIMenuController sharedMenuController].menuItems = [NSArray arrayWithObject:menuItem];
}

秘訣は、メニューが1回だけでなく、押し込まれるたびにカスタムメニュー項目を追加する必要があることです。カスタムメニュー項目リストは毎回クリアされると思います。

于 2012-12-06T13:33:14.690 に答える
1

以下のコードを試してみましたが、うまくいきます。ポイントは、メニューが表示される前に、カスタムメニュー項目を追加してから、メニューを自分で表示することです。

-(void)viewDidLoad { [super viewDidLoad];

 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(menuWillShow) name:UIMenuControllerWillShowMenuNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(menuDidShow) name:UIMenuControllerDidShowMenuNotification object:nil];

}

-(void)menuDidShow{

 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(menuWillShow) name:UIMenuControllerWillShowMenuNotification object:nil];

}

-(void)menuWillShow{

UIMenuItem *shareMenu = [[UIMenuItem alloc] initWithTitle:@"微博分享" action:@selector(shareToWeibo:)];
UIMenuController *menu = [UIMenuController sharedMenuController];
[menu setMenuItems:[NSArray arrayWithObjects:shareMenu, nil]];

[[NSNotificationCenter defaultCenter] removeObserver:self name:UIMenuControllerWillShowMenuNotification object:nil];

[menu setTargetRect:selectedRect inView:self.view]; //設定する必要があります。そうしないと、メニューの場所は変更されません

[menu setMenuVisible:YES animated:YES];

}

于 2012-12-06T10:07:34.373 に答える
0

まだこれが必要な人のために:

UIMenuControllerDidHideMenuNotificationを観察する必要があります。

viewDidApear:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(menuDidHide) name:UIMenuControllerWillShowMenuNotification object:nil];

viewDidDisapear:

[[NSNotificationCenter defaultCenter] removeObserver:self name:UIMenuControllerDidHideMenuNotification object:nil];

menuDidHide

UIMenuItem *menuItem = [[UIMenuItem alloc] initWithTitle:@"Read selected" action:@selector(readSelectedText)];
[UIMenuController sharedMenuController].menuItems = [NSArray arrayWithObject:menuItem];
于 2016-03-14T19:51:46.567 に答える