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;
}
J'ai cela. Dans le fichier d'implémentation de MyViewController - (BOOL) canBecomeFirstResponder { \t return YES; } – aahrens
Mais vous devez appeler [someView becomeFirstResponder] pour devenir le premier répondeur. – TomSwift
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