Как добавить пользовательский UIMenuItem в UIMenuController в UITextView? - PullRequest
17 голосов
/ 16 июля 2010

Я пытаюсь добавить пункт меню рядом с пунктами «копировать», «вставить» в UITextView.Я создал подкласс UITextView и скопировал пример из документации Apple:

http://developer.apple.com/iphone/library/documentation/General/Conceptual/iPadProgrammingGuide/Text/Text.html#//apple_ref/doc/uid/TP40009370-CH8-SW28

Я просто создал UiTextView в IB и установил его класс в свой класс CustomTextView.К сожалению, это не сработало.Хотя, если я установил свой CustomTextView в подкласс UIView, он прекрасно работает.Любая помощь здесь?

Я также сделал очень простой пример проекта моей ситуации здесь:

apps.popsweet.com / TextViewTrial.zip

Ответы [ 2 ]

39 голосов
/ 20 июля 2010

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

- (void)viewDidLoad {
    [super viewDidLoad];

    UIMenuItem *menuItem = [[UIMenuItem alloc] initWithTitle:@"Change Color" action:@selector(changeColor:)];
    [[UIMenuController sharedMenuController] setMenuItems:[NSArray arrayWithObject:menuItem]];
    [menuItem release]; 
}

Затем я добавил следующее в контроллер представления для условного отображения элемента при выделении текста в UITextView, который я назвал «textView»:

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

Я решил разместить canPerformAction: withSender: метод в контроллере представления вместо пользовательского класса UITextView, потому что таким образом другие параметры (например, копирование, вырезание, вставка и т. Д.) Ведут себя так, как обычно, так как метод вызывается на каждом объекте вверх по цепочке респондента.

1 голос
/ 19 июля 2010

Мне удалось создать только пользовательский пункт меню, который ВСЕГДА присутствует во всплывающем меню, выполнив следующие действия:

- (void) setUpCustomMenu {
Class cls1 = NSClassFromString(@"UIMenuController");
Class cls2 = NSClassFromString(@"UIMenuItem");
if (cls1 && cls2)
    if ([UIMenuController instancesRespondToSelector:@selector(setMenuItems:)]) {
            UIMenuItem* item1 = [[UIMenuItem alloc] initWithTitle:@"My Menu Item" action:@selector(myMenuAction:)];
            [UIMenuController sharedMenuController].menuItems = [NSArray arrayWithObjects:item1, nil];;
            [item1 release];
    }
}

Это вызывается в viewDidLoad контроллера представления.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...