2010-11-23 15 views
2

J'essaie d'afficher un UIMenuController personnalisé lorsqu'un utilisateur appuie longuement sur une cellule dans un UITableView groupé. Cependant, je n'arrive pas à afficher UIMenuController après avoir réussi à détecter le long appui. Toute aide est grandement appréciée.Problème lors de l'affichage de UIMenuController lorsque la cellule est tapée dans UITableView

MyViewController.h 
@interface MyViewController : UIViewController <UITableViewDelegate,UITableViewDataSource> 
    UITableView *table; 
    @property (nonatomic, retain) IBOutlet UITableView *table; 
@end 

Dans le cellForRowAtIndexPath Je joins ma longue presse Gesture Recognizer

cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:SectionsTableIdentifier] autorelease]; 
    UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleLongPress:)]; 
    [cell addGestureRecognizer:longPress]; 
    [longPress release]; 

Voici ma méthode d'action handleLongPress

-(void)handleLongPress:(UIGestureRecognizer *)longPress { 

    if (longPress.state == UIGestureRecognizerStateBegan) { 

    CGPoint pressLocation = [longPress locationInView:self.table]; 
    NSIndexPath *pressedIndexPath = [self.table indexPathForRowAtPoint:pressLocation]; 

    UIMenuItem *first = [[UIMenuItem alloc] initWithTitle:@"Save" action:@selector(saveRecent)]; 
    UIMenuItem *second = [[UIMenuItem alloc] initWithTitle:@"Edit" action:@selector(editQuery)]; 

    UIMenuController *menuController = [UIMenuController sharedMenuController]; 
    menuController.menuItems = [NSArray arrayWithObjects:first,second,nil]; 

    [menuController setTargetRect:longPress.view.frame inView:longPress.view.superview]; 
    [menuController setMenuVisible:YES animated:YES]; 
    [pressedIndexPath release]; 
    } 
} 

Les méthodes d'action pour l'Edition et Enregistrer afficher juste un UIAlertView. J'ai aussi mis en œuvre la méthode ci-dessous pour faire en sorte que lorsque le UIMenuController est affiché uniquement Sauvegarder et modifier les options seront présents

-(BOOL)canPerformAction:(SEL)action withSender:(id)sender { 

BOOL canPerform = NO; 

if (action == @selector(saveRecent)) { 
    canPerform = YES; 
} 
if (action == @selector(editQuery)) { 
    canPerform = YES; 
} 

return canPerform; 
} 

Je suis aussi être MyViewController réclame des premiers intervenants

-(BOOL)canBecomeFirstResponder { 

    return YES; 
} 

Répondre

1

Je crois que vous avez besoin avoir une vue revendiquant le statut firstResponder afin de présenter le UIMenuController. Je ne vois pas cela se produire dans votre code.

J'ai écrit instructions pour l'utilisation du UIMenuController comme une réponse à cette question:

Customize UIMenuController

+0

J'ai cela. Dans le fichier d'implémentation de MyViewController - (BOOL) canBecomeFirstResponder { \t return YES; } – aahrens

+2

Mais vous devez appeler [someView becomeFirstResponder] pour devenir le premier répondeur. – TomSwift

+0

UIMenuController utilise la vue firstResponder comme point de départ pour envoyer des messages. S'il n'y a pas de premier répondeur actif, alors il ne montrera pas le menu. La vue à laquelle votre menu s'applique doit être rendue le premier répondant en appelant la fonction firstFesponder. – TomSwift