Ответ 1
Сагар,
Ваш вопрос пару месяцев назад, но я, наконец, понял это, поэтому я решил, что отвечу на него, если он поможет кому-то другому.
Я добавил следующий код в viewDidAppear: метод контроллера представления, который содержит веб-просмотр.
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
UIMenuItem *customMenuItem1 = [[[UIMenuItem alloc] initWithTitle:@"Custom 1" action:@selector(customAction1:)] autorelease];
UIMenuItem *customMenuItem2 = [[[UIMenuItem alloc] initWithTitle:@"Custom 2" action:@selector(customAction2:)] autorelease];
[[UIMenuController sharedMenuController] setMenuItems:[NSArray arrayWithObjects:customMenuItem1, customMenuItem2, nil]];
}
В моем представленииDidDisappear:, Я продолжаю и удаляю эти элементы:
- (void)viewDidDisappear:(BOOL)animated {
[super viewDidDisappear:animated];
[[UIMenuController sharedMenuController] setMenuItems:nil];
}
Затем я применил метод canPerformAction: withSender: в контроллере представления. Это помогает понять концепцию ответчиков и цепочек ответчиков, чтобы понять, что здесь происходит. В основном, ваш uiviewcontroller является частью цепочки ответчиков, поэтому его спрашивают, может ли он обрабатывать любые действия (например, ваши пользовательские действия, добавленные выше), которые объекты выше цепочки ответчиков (например, UIWebView) не знают, как обращаться ( см. Документация UIResponder и Руководство по обработке событий для iOS для деталей gory).
Теперь, когда canPerformAction: withSender: вызывается для веб-просмотра, параметр отправителя устанавливается на nil. Итак, я стараюсь быть немного умным в том, как я пишу эту функцию. В принципе, я уверен, что отправитель равен нулю, я показываю веб-просмотр пользователю, и любые другие элементы управления на странице не являются первыми ответчиками. Если это случай, тогда я проверяю, является ли это одним из действий, которые я определил выше, и повторите ДА, если это так. Во всех остальных случаях я возвращаю значение по умолчанию из UIViewController, вызывая тот же метод в супер.
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender {
if (webView.superview != nil && ![urlTextField isFirstResponder]) {
if (action == @selector(customAction1:) || action == @selector(customAction2:)) {
return YES;
}
}
return [super canPerformAction:action withSender:sender];
}
Конечно, теперь на следующем этапе мы выясним, как на самом деле что-то делать с выбором (возможно, запустив JavaScript в веб-просмотре).