2010-06-02 8 views
20

Chcę pokazać 2 opcje, takie jak "cześć" & "pa", gdy użytkownik zakończy wybór na UIWebView.pokazujące menu niestandardowe przy wyborze w UIWebView w iphone

Dodałem obserwatora do mojego kontrolera widoku w następujący sposób. Ale nie znam dalszej implementacji.

[[UIMenuController sharedMenuController] addObserver:self 
              forKeyPath:UIMenuControllerWillShowMenuNotification 
              options:nil 
              context:nil 
]; 

Odpowiedz

44

Sagar,

Twoje pytanie jest kilka miesięcy, ale w końcu zorientowali ten jeden, więc pomyślałem, że go odebrać w przypadku, gdy pomaga się komuś innemu.

Dodałem następujący kod do metody viewDidAppear: metoda kontrolera widoku, który zawiera widok WWW.

- (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]]; 
} 

W moim viewDidDisappear :, I śmiało i usunąć te elementy:

- (void)viewDidDisappear:(BOOL)animated { 
    [super viewDidDisappear:animated]; 

    [[UIMenuController sharedMenuController] setMenuItems:nil]; 
} 

Potem wdrożył canPerformAction: withSender: metodę w kontroler widoku. Pomaga zrozumieć koncepcję respondentów i łańcuchów odpowiadających, aby zrozumieć, co się tutaj dzieje. Zasadniczo twój kontroler uiview jest częścią łańcucha responder, więc zostaje zapytany, czy może obsłużyć dowolne działania (takie jak twoje niestandardowe akcje dodane powyżej), że obiekty znajdujące się wyżej w łańcuchu respondenta (np. UIWebView) nie wiedzą, jak sobie z tym poradzić (patrz UIResponder documentation i Event Handling Guide for iOS, aby uzyskać szczegółowe informacje).

Teraz, gdy canPerformAction: withSender: jest wywoływana dla widoku WWW, parametr sender jest ustawiony na zero. Tak więc staram się być nieco sprytny, jeśli chodzi o pisanie tej funkcji. Zasadniczo upewniam się, że nadawca jest zerowy, wyświetlam przeglądarkę użytkownikowi, a wszelkie inne elementy sterujące na stronie nie są pierwszą odpowiedzią. Jeśli tak jest, to sprawdzam, czy jest to jedno z działań, które zdefiniowałem powyżej i ponownie zwracam TAK, jeśli tak jest. We wszystkich innych przypadkach zwracam domyślną wartość z UIViewController, wywołując tę ​​samą metodę na super.

- (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]; 
} 

Oczywiście, teraz następnym krokiem jest dowiedzieć się, jak faktycznie coś zrobić z wyboru (prawdopodobnie przez uruchomienie JavaScript w WebView).

+0

Nadal można przyznać mi nagrodę, jeśli chcesz :-) – Jacques

+1

usunąłem czek dla nadawcy == nil ponieważ przyszłe wersje iOS może ustawić nadawcę o czymś innym niż zero – Jacques

+0

Chciałbym zaprosić możesz odpowiedzieć na to pytanie http://stackoverflow.com/questions/31183894/uimenucontroller-method-settargetrectinview-not-working-in-uitableview –

3

w Swift:

class ViewController: UIViewController { 
    override func viewDidAppear(animated: Bool) { 
     super.viewDidAppear(animated) 

     // add two custom menu items to the context menu of UIWebView (assuming in contenteditable mode) 
     let menuItem1 = UIMenuItem(title: "Foo", action: #selector(ViewController.foo)) 
     let menuItem2 = UIMenuItem(title: "Bar", action: #selector(ViewController.bar)) 
     UIMenuController.sharedMenuController().menuItems = [menuItem1, menuItem2] 
    } 

    override func viewDidDisappear(animated: Bool) { 
     super.viewDidAppear(animated) 
     UIMenuController.sharedMenuController().menuItems = nil 
    } 

    override func canPerformAction(action: Selector, withSender sender: AnyObject?) -> Bool { 
     if webView?.superview != nil { 
      if action == #selector(ViewController.foo) || action == #selector(ViewController.bar) { 
       return true 
      } 
     } 

     return super.canPerformAction(action, withSender: sender) 
    } 

    func foo() { 
     print("foo") 
    } 

    func bar() { 
     print("bar") 
    } 
} 

Uwaga: #selector jest dostępny w Swift 2.2.

screenshot

Powiązane problemy