Проблемы с отображением UIMenuController при подключении ячейки в UITableView - PullRequest
2 голосов
/ 23 ноября 2010

Я пытаюсь отобразить пользовательский UIMenuController, когда пользователь долго нажимает на ячейку в сгруппированном UITableView. Тем не менее, я не могу получить UIMenuController для отображения после успешного обнаружения долгого нажатия. Любая помощь очень ценится.

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

В cellForRowAtIndexPath я присоединяю свой распознаватель жестов длинного нажатия

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

Вот мой метод действия 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];
  }
}

Методы Action для редактирования и сохранения просто отображают UIAlertView. Я также реализовал описанный ниже метод, чтобы при отображении UIMenuController присутствовали только параметры сохранения и редактирования

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

 BOOL canPerform = NO;

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

 return canPerform;
}

Я также утверждаю, что MyViewController является первым респондентом

-(BOOL)canBecomeFirstResponder {

  return YES;
}

1 Ответ

1 голос
/ 23 ноября 2010

Я полагаю, что для представления UIMenuController вам необходимо иметь представление, запрашивающее статус firstResponder. Я не вижу, что происходит в вашем коде.

Я написал инструкции по использованию UIMenuController в качестве ответа на этот вопрос:

Настройка UIMenuController

...