Я пытаюсь добавить пункт меню рядом с "копией", объектами "вставки" в UITextView. Я создал подкласс UITextView и скопировал пример с документов яблока здесь:
Я просто создал UiTextView в IB и установил его класс на мой класс CustomTextView. К сожалению, это не работало. Хотя, если я установил свой CustomTextView на подкласс UIView, он работает отлично. Какая-либо справка здесь?
Я также сделал очень простой проект в качестве примера из своей ситуации здесь:
apps.popsweet.com/TextViewTrial.zip
В итоге я использовал следующее с желаемыми результатами. Я поместил следующий блок в метод 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, потому что таким образом другие параметры (например, копировать, вырезать, paste и т. д.) ведут себя как обычно, поскольку метод вызывается для каждого объекта в цепочке респондента.
Я смог создать пользовательский пункт меню, который ВСЕГДА присутствует во всплывающем меню, только сделав следующее:
- (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 контроллера представления.
Я все еще пытаюсь заставить его показывать мой пункт меню только условно (если, например, что-то выбрано), перехватывая событие, вызывающее контроллер меню. Пока что мне не удалось сделать вот что.