Как добавить пользовательский UIMenuItem в UIMenuController в UITextView?
Я пытаюсь добавить пункт меню рядом с элементами "копировать", "вставить" в UITextView. Я создал подкласс UITextView и скопировал пример из apple docs здесь:
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
Ответы
Ответ 1
Итак, я закончил использовать следующие результаты, которые хотел, я поместил следующий блок в метод 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, потому что таким образом другие параметры (например, копирование, вырезание, вставка и т.д.) ведут себя так, как обычно, с момента вызова метода на каждом объекте по цепочке ответчиков.
Ответ 2
Я смог создать пользовательский элемент меню, который ВСЕГДА присутствует во всплывающем меню, выполнив следующие действия:
- (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 контроллера вида.
Я все еще изо всех сил стараюсь, чтобы это только отображало мой пункт меню условно (если, например, есть что-то выбранное), перехватывая событие, вызывающее контроллер меню. Пока я не смог этого сделать.