2010-06-02 4 views

Répondre

44

Sagar,

Votre question est deux ou trois mois, mais j'ai finalement compris celui-ci, donc je me suis dit que je répondrais dans le cas où il aide à quelqu'un d'autre.

J'ai ajouté le code suivant à la méthode viewDidAppear: du contrôleur de vue qui contient la vue Web.

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

Dans mon viewDidDisappear :, j'aller de l'avant et retirer ces articles:

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

    [[UIMenuController sharedMenuController] setMenuItems:nil]; 
} 

Ensuite, je mis à exécution les canPerformAction: withSender: méthode dans le contrôleur de vue. Cela aide à comprendre le concept de répondeurs et de chaînes de répondeurs pour comprendre ce qui se passe ici. Fondamentalement, votre uiviewcontroller fait partie de la chaîne de répondeurs, donc on lui demande s'il peut gérer des actions (comme vos actions personnalisées que vous avez ajoutées ci-dessus) que les objets plus haut de la chaîne répondeur (comme UIWebView) ne savent pas gérer (voir le UIResponder documentation et le Event Handling Guide for iOS pour les détails sanglants).

Maintenant, lorsque canPerformAction: withSender: est appelé pour le webview, le paramètre expéditeur est défini sur nil. Donc, j'essaie d'être un peu intelligent sur la façon dont j'écris cette fonction. Fondamentalement, je m'assure que l'expéditeur est nul, je montre le webview à l'utilisateur, et tous les autres contrôles sur la page ne sont pas le premier répondeur. Si c'est le cas, je vérifie pour voir si c'est l'une des actions que j'ai définies ci-dessus et reviens OUI si c'est le cas. Dans tous les autres cas, je renvoie la valeur par défaut de UIViewController en appelant la même méthode sur 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]; 
} 

Bien sûr, maintenant l'étape suivante est de déterminer comment faire en fait quelque chose avec la sélection (probablement en exécutant un JavaScript dans WebView).

+0

Vous pouvez toujours me attribuer une prime si vous voulez :-) – Jacques

+1

J'ai enlevé le chèque de l'expéditeur == néant parce que les futures versions d'iOS missent expéditeur autre chose que nul – Jacques

+0

je voudrais inviter vous de répondre à cette question http://stackoverflow.com/questions/31183894/uimenucontroller-method-settargetrectinview-not-working-in-uitableview –

3

En rapide:

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

Note: #selector est disponible dans Swift 2.2.

screenshot

Questions connexes