4

カスタムUIMenuItemを iPhone アプリのコピー & ペースト メニューに追加することに成功し、標準のメニュー項目を取り除くためにUITextViewをサブクラス化することさえできました。ただし、メニューが実際に表示される前にメニューが表示されるという事実を何らかの方法でキャプチャし、挿入ポイントに単語をメニューに追加する必要があります。

たとえば、UITextViewのテキストが「This is a test.」の場合。、そして人が「is」という単語に触れた場合、その単語を UIMenuItem としてUIMenuController追加します。

タッチした直後にのみメニューに単語を表示することが重要です。次にメニューを呼び出すと、次にタッチした単語が表示されます。メニュー内の単語にタッチすると、詳細が表示されます。selectedRangeに基づいて touched という単語を見つけるコードが既にあります。メニューが表示される前に、その単語をUIMenuItemとして追加するだけです。もう 1 つの洗練されていない解決策は、ユーザーが静的なメニュー項目に触れてから、触れた単語に基づいてさまざまなオプションでメニューを追加および再表示できるようにすることです。

UIMenuControllerをサブクラス化してインターセプトする方法があることを願っています。これにより、バルーンが表示される前に挿入ポイントに到達できますが、メニュー項目リストを変更することで、バルーンに変更を加えることができます。

これを行う方法はありますか?だれかコード スニペットを見せてくれたり、役立つドキュメントを教えてくれませんか? ありがとう。

私の唯一の他の解決策は、どうにかして独自のバルーンを作成し、どういうわけかコピー & ペースト メニューを無効にすることです。私はむしろそれを試す必要はありません。

4

2 に答える 2

5

起動時のどこか:

UIMenuItem *testMenuItem = [[UIMenuItem alloc] initWithTitle:@"Test" action:@selector(test:)];
[UIMenuController sharedMenuController].menuItems = [NSArray arrayWithObject:testMenuItem];
[testMenuItem release];

そしてあなたUITextViewまたはUITextFieldサブクラスで:

@implementation MyTextView
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender {
    if (action == @selector(test:)) {
        // Return YES only if it's possible to perform the action at this time
        return YES;
    }
    return [super canPerformAction:action withSender:sender];
}
- (void)test:(id)sender {
    // Perform the action here
}
@end
于 2010-10-12T15:05:10.650 に答える
0

UIMenuControllerWillShowMenuNotification質問がまだ関連している場合は、またはUIMenuControllerDidShowMenuNotification通知を使用できます。
こちらのドキュメントを参照してください。

コードサンプル:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(willShowMenu:) name:UIMenuControllerWillShowMenuNotification object:nil];
于 2011-06-13T10:03:15.730 に答える