2010-06-02 30 views
20

Kullanıcı UIWebView'da seçimi tamamladığında "merhaba" gibi & "bye" gibi 2 seçeneği göstermek istiyorum.iphone'da UIWebView'da özel menü gösteriliyor

Görünüm denetleyicime aşağıdaki gibi gözlemci ekledim. Ama daha fazla uygulamayı bilmiyorum.

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

cevap

44

Sagar,

Sorunuz eski birkaç ay, ama nihayet bu bir anladım, bu yüzden başkası yardımcı oluyor bu durumda ben cevap dedim.

Aşağıdaki kodu web görünümünü içeren görünüm denetleyicisinin viewDidAppear: yöntemine ekledim. Benim viewDidDisappear yılında

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

:, Ben önden gidip o öğeleri kaldırmak: görünüm denetleyicisi yöntemi: withSender:

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

    [[UIMenuController sharedMenuController] setMenuItems:nil]; 
} 

Sonra ben canPerformAction uyguladı. Burada neler olup bittiğini anlamak için yanıtlayıcıların ve yanıtlayan zincirlerinin kavramını anlamaya yardımcı olur. Temel olarak, uiview denetleyiciniz yanıtlayıcı zincirinin bir parçasıdır, bu nedenle, yanıtlayıcı zincirden (UIWebView gibi) daha yüksek olan nesnelerin nasıl işleneceğini bilmediği herhangi bir eylemi (yukarıda eklediğiniz özel eylemleriniz gibi) ele alıp alamayacağı sorulur (gory detayları için UIResponder documentation ve Event Handling Guide for iOS'a bakın).

Şimdi, canPerformAction: withSender: web görünümü için çağrıldığında, gönderici parametresi sıfırlanır. Yani, bu işlevi nasıl yazdığım konusunda biraz zeki olmaya çalışıyorum. Temel olarak, gönderenin geçersiz olduğundan emin olun, web sayfasını kullanıcıya gösteriyorum ve sayfadaki diğer tüm denetimler ilk yanıtlayıcı değil. Eğer durum buysa, bunun yukarıda tanımladığım eylemlerden biri olup olmadığını ve varsa EVET'i döndürüp döndürmediğini kontrol ediyorum. Diğer tüm durumlarda, süper üzerinde aynı yöntemi çağırarak UIViewController'dan varsayılan değeri döndürürüm. Tabii

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

, şimdi bir sonraki adım aslında (muhtemelen Web görünümündeki bazı JavaScript çalıştırarak) seçimle şeyin nasıl tespit etmektir. Swift ise

+0

ben gönderen için onay kaldırıldı – Jacques

+1

:-) isterseniz hala bana bir lütuf ödül olabilir == nil iOS gelecekteki sürümlerinde nil – Jacques

+0

ben davet ediyorum dışında bir gönderen ayarlamak çünkü Bu soruyu cevaplamak için http://stackoverflow.com/questions/31183894/uimenucontroller-method-settargetrectinview-not-working-in-uitableview –

3

:

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

Not: #selector Swift 2.2 mevcuttur.

screenshot

İlgili konular