2010-07-16 14 views
1

Je développe une application iPhone et j'ai travaillé avec UIWebViews. J'ai prévu de personnaliser les UIMenuItems qui sont apparus lorsque je souligne des chaînes dans UiWebView (Copier, Sélectionner tout, Couper, etc.). J'ai essayé de supprimer ces menusItems mais je ne peux pas supprimer l'élément de menu COPY.Comment supprimer COPY UIMenuItem dans UIMenuController

J'ai besoin de votre aide les gars.

Merci, ZaldzBugz

+0

Je crois que cela pourrait être fait dans canPerformAction. Mais je ne sais vraiment pas comment supprimer l'élément de menu COPY. – Zaldy

+1

Salut, pouvez-vous me dire comment supprimer l'autre élément de menu dans UIMenuController? Je veux supprimer l'élément de la flèche –

+0

@Risma - Vous avez une chance d'essayer de supprimer l'élément de la flèche et de placer tous les menus disponibles dans le cadre principal lui-même? –

Répondre

2

Vous allez devoir faire un peu de détournement d'avion. Je ne sais même pas si c'est possible. On dirait qu'il répond probablement à un événement gestuel appelé UILongPressGestureRecognizer.

Vous devez savoir quelle vue a été ajoutée à ce geste. quelque chose comme ça.

NSArray *gestures = myWebView.gestureRecognizers; 
for(int i=0;i<[gestures count];i++){ 
    UIGestureRecognizer g = [gestures objectAtIndex:i]; 
    if([g isKindOfClass:UILongPressGestureRecognizer.Class]){ 
     [myWebView removeGestureRecognizer:g]; 
     break; 
    } 
} 

mais je ne pense pas que le geste se trouve directement sur l'UIWebview. C'est sur l'une de ses sous-vues.

Il est peut-être sur cette sous-vue

UIScrollView *sview = [[mywebview subviews] objectAtIndex:0]; 

Si pas sur celui-là alors il est probablement le point de vue qui est sur le dessus le plus, ce qui est ce que je pense. C'est un type View non documenté, mais si vous le traitez comme un UIView pour les méthodes que nous appelons, il est probablement sûr. Aussi, parce que vous le traitez comme un UIView, ce n'est pas contre les règles autant que je comprends.

UIScrollView *sview = [[mywebview subviews] objectAtIndex:0]; 
UIView *realWebView = [[sview subviews] objectAtIndex:10]; 

La raison pour laquelle je n'ai pas écrit l'extrait (qui est non testé) pour essayer d'enlever le geste de tous les points de vue est parce qu'il est important que vous sachiez quelle vue vous le retirez. Une fois que vous l'avez supprimé, vous devez écrire votre propre UILongPressGestureRecognizer, puis ajouter le nouveau dans la vue correspondante (la vue à partir de laquelle il a été supprimé).

Vous avez perdu toutes vos fonctionnalités de copie sélectionnez etc ... mais maintenant vous pouvez implémenter votre propre.

Si vous voulez certaines des anciennes fonctionnalités, je pense que je sais comment vous pouvez le récupérer, mais Je ne peux pas promettre que cela est autorisé ou sûr.

Avant de supprimer le geste, vous devez remplacer une méthode par UIView. Vous devriez être en mesure de le faire dans votre fichier de classe de travail en cours (en haut du fichier)

@implementation UIView (extended) 
    -(BOOL) respondsToSelector:(SEL)aSelector { 
      printf("SELECTOR: %s\n", 
      [NSStringFromSelector(aSelector) UTF8String]); 

      return [super respondsToSelector:aSelector]; 
    } 
@end 

Je ne peux rien promettre, mais cela ne devrait enregistrer le nom de chaque méthode qui est appelée à votre avis .

Exécutez votre application et exécutez la copie, coller, sélectionner, sélectionner toutes les méthodes. Votre journal devrait montrer quelles méthodes sont appelées lorsque vous appuyez sur les boutons. Il peut montrer plusieurs méthodes lorsque vous appuyez sur un bouton, vous voulez probablement juste le premier. Maintenant, lorsque vous créez un menuItem, vous savez quel sélecteur lui affecter.

Tout cela n'est qu'une supposition. J'espère que cela aide.

1

J'ai utilisé la technique dans this answer pour une question similaire et cela fonctionne pour débarrasser de l'élément de menu Copier.Autrement dit, remplacez UIWebView au lieu de UITextView dans leur exemple. Également écrit un canPerformAction: withSender: dans le contrôleur de vue qui retourne YES pour mes sélecteurs personnalisés et NO pour le copier: selector, puis retourne la valeur de la super implémentation si le sélecteur n'en est aucun. N'oubliez pas de définir le nom de sous-classe UIWebView personnalisé dans votre fichier xib.