2010-06-02 12 views
20

Ich möchte 2 Optionen wie "Hallo" & "Tschüss" zeigen, wenn Benutzer die Auswahl auf UIWebView abgeschlossen.zeigt benutzerdefinierte Menü auf Auswahl in UIWebView in iPhone

Ich habe Beobachter zu meinem View-Controller wie folgt hinzugefügt. Aber ich weiß keine weitere Implementierung.

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

Antwort

44

Sagar,

Ihre Frage ist ein paar Monate alt, aber ich endlich diese ein herausgefunden, so dass ich dachte ich sie beantworten würde, falls es jemand anderes hilft heraus.

Ich habe den folgenden Code der viewDidAppear hinzugefügt: Methode des View-Controllers, der die Webansicht enthält.

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

In meinem viewDidDisappear :, ich voran gehen und entfernen diese Elemente:

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

    [[UIMenuController sharedMenuController] setMenuItems:nil]; 
} 

Dann habe ich die canPerformAction umgesetzt: withSender: Methode im View-Controller. Es hilft, das Konzept von Respondern und Responderketten zu verstehen, um zu verstehen, was hier vor sich geht. Im Grunde ist Ihr uiviewcontroller Teil der Responder-Kette. Daher wird er gefragt, ob er mit Aktionen (wie den von Ihnen oben hinzugefügten benutzerdefinierten Aktionen) umgehen kann, ob Objekte in der Responder-Kette (wie das UIWebView) nicht wissen, siehe die UIResponder documentation und die Event Handling Guide for iOS für die blutigen Details).

Wenn nun canPerformAction: withSender: für die Webansicht aufgerufen wird, wird der sender-Parameter auf nil festgelegt. Also versuche ich ein wenig clever zu sein, wie ich diese Funktion schreibe. Im Grunde stelle ich sicher, dass der Absender null ist, ich zeige dem Benutzer das Webview, und alle anderen Steuerelemente auf der Seite sind nicht der erste Responder. Wenn das der Fall ist, überprüfe ich, ob dies eine der oben definierten Aktionen ist, und gebe JA zurück, wenn dies der Fall ist. In allen anderen Fällen gebe ich den Standardwert von UIViewController zurück, indem ich dieselbe Methode für super aufruft.

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

Natürlich, jetzt der nächste Schritt besteht darin, herauszufinden, wie man tatsächlich mit der Auswahl etwas zu tun (wahrscheinlich durch einige JavaScript in der Webansicht ausgeführt wird).

+0

Sie verleihen mir noch eine Prämie, wenn Sie wollen :-) – Jacques

+1

ich den Scheck für Absender entfernt == null, weil zukünftige Versionen von iOS könnte Absender auf etwas anderes gesetzt als null – Jacques

+0

Ich möchte einladen Sie, diese Frage zu beantworten http://stackoverflow.com/questions/31183894/uimenucontroller-method-settargetrectinview-not-working-in-uitableview –

3

In 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") 
    } 
} 

Hinweis: #selector ist in Swift 2.2 zur Verfügung.

screenshot

Verwandte Themen