Добавление динамического пользовательского UIMenuItem в меню «Копировать и вставить» перед его отображением - PullRequest
4 голосов
/ 12 октября 2010

Я успешно смог добавить пользовательский UIMenuItem в меню «Копировать и вставить» в приложении для iPhone и даже создать подкласс UITextView , чтобы избавиться от стандартных пунктов меню.Однако мне нужно как-то уловить тот факт, что меню будет отображаться до того, как оно произойдет, и добавить слово в точке вставки в меню.

Например, если текств UITextView это «Это тест». , и человек коснулся слова «это» , он добавил бы это слово как UIMenuItem для UIMenuController .

Важно, чтобы меню отображало слово только непосредственно после его прикосновения.При следующем вызове меню будет показано следующее слово, к которому вы прикоснулись, и т. Д. Прикосновение к слову в меню отобразит более подробную информацию.У меня уже есть код, который находит слово, к которому прикоснулись, основываясь на selectedRange .Все, что мне нужно сделать, это добавить это слово как UIMenuItem перед отображением меню.Другое менее изящное решение может заключаться в том, чтобы позволить человеку прикоснуться к статическому элементу меню, который затем добавляет и повторно отображает меню с различными параметрами в зависимости от слова, к которому прикоснулись.

Я надеюсь, что есть способ перехватить UIMenuController , возможно, путем создания его подкласса, так что я могу добраться до точки вставки до отображения всплывающей подсказки, но все же могу изменить ее, изменив список пунктов меню.

Есть ли способ сделать это?Кто-нибудь может показать мне фрагмент кода или указать мне документацию, которая может мне помочь?Спасибо.

Мое единственное другое решение - каким-то образом создать собственный шар и как-то отключить меню «Копировать и вставить».Я бы предпочел не испытывать это.

Ответы [ 2 ]

5 голосов
/ 12 октября 2010

При запуске где-то:

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
0 голосов
/ 13 июня 2011

Если вопрос по-прежнему актуален, вы можете использовать уведомление UIMenuControllerWillShowMenuNotification или UIMenuControllerDidShowMenuNotification.
См. документацию здесь .

Пример кода:

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