UITableViewCell не станет первым респондентом (показывает UIMenuController на жесте ячейки)

У меня есть заявление с UITabBar, Каждая вкладка является UINavigationController с несколькими UIViewControllers внутри. Один из этих контроллеров представления содержит UITableViewи я хочу отобразить плавающее меню для удаления долго нажатой UITableViewCell,

я использую UIMenuController но это не отображается, потому что клетка отказывается стать первым респондентом.

Вот мой код:

    - (void)viewDidLoad
    {
        [super viewDidLoad];

        UILongPressGestureRecognizer *lpgr = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleLongPress:)];
        lpgr.minimumPressDuration = 1.0; //second
        [table addGestureRecognizer:lpgr];

        [lpgr release];
    }

-(void)handleLongPress:(UILongPressGestureRecognizer *)gestureRecognizer {
    if (gestureRecognizer.state == UIGestureRecognizerStateBegan) {
        CGPoint p = [gestureRecognizer locationInView: table];

        NSIndexPath *indexPath = [table indexPathForRowAtPoint:p];
        if (indexPath != nil) {
            UITableViewCell* cell = [self tableView:table cellForRowAtIndexPath: indexPath];

            [cell becomeFirstResponder];
            UIMenuItem *delete = [[UIMenuItem alloc] initWithTitle:@"Delete" action:@selector(delete:)];

            UIMenuController *menu = [UIMenuController sharedMenuController];
            [menu setMenuItems:[NSArray arrayWithObjects:delete, nil]];
            [menu setTargetRect:cell.frame inView:cell.superview];
            [menu setMenuVisible:YES animated:YES];
        }
    }
}

На UITableViewCell я переопределил метод:

-(BOOL) canBecomeFirstResponder {
    return YES;
}

Любые идеи о том, почему клетка не становится первым респондентом?

Спасибо!

1 ответ

Решение

Я думаю, что я исправил ваш код:-)

-(void)handleLongPress:(UILongPressGestureRecognizer *)gestureRecognizer {
    if (gestureRecognizer.state == UIGestureRecognizerStateBegan) {
        CGPoint p = [gestureRecognizer locationInView: self.tableView];
        NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:p];
        if (indexPath != nil) {

            [self becomeFirstResponder];
            UIMenuItem *delete = [[UIMenuItem alloc] initWithTitle:@"Delete" action:@selector(customDelete:)];

            UIMenuController *menu = [UIMenuController sharedMenuController];
            [menu setMenuItems:[NSArray arrayWithObjects:delete, nil]];
            [menu setTargetRect:[self.tableView rectForRowAtIndexPath:indexPath] inView:self.tableView];
            [menu setMenuVisible:YES animated:YES];
        }
    }
}

- (void)customDelete:(id)sender {
//
}

- (BOOL)canBecomeFirstResponder {
    return YES;
}

- (BOOL)canPerformAction:(SEL)action withSender:(id)sender {
    if (action == @selector(customDelete:) ){
        return YES;
    }
    return NO;
}

Я сделал следующее..

  1. [self стал FirstResponder];
  2. [menu setTargetRect: [self.tableView rectForRowAtIndexPath: indexPath] inView: self.tableView];
  3. Добавлено true для canPerformAction Не требуется в основном, если вы реализовали функцию

Пожалуйста, измените табличное представление и другие вещи на ваши локальные ссылочные переменные:-)

Приятного чтения - http://www.intridea.com/blog/2010/12/22/developers-notes-for-uimenucontroller

Другие вопросы по тегам