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;
}

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

Спасибо!


person momo    schedule 03.12.2012    source источник
comment
Можете ли вы сказать мне, почему он должен стать первым ответчиком? В любом случае первым ответчиком должно быть ваше меню, которое добавляется вверху вашей ячейки!   -  person imthi    schedule 03.12.2012
comment
@imthi Я читал, что он должен быть первым ответчиком, чтобы показать меню. В любом случае, моя проблема в том, что меню не отображается, просто я думал, что это связано с тем, кто первым ответит   -  person momo    schedule 03.12.2012


Ответы (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. [я стал первым ответчиком];
  2. [меню setTargetRect:[self.tableView rectForRowAtIndexPath:indexPath] inView:self.tableView];
  3. Добавлено значение true для canPerformAction. В основном это не требуется, если вы реализовали функцию.

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

Полезно прочитать — http://www.inridea.com/blog/2010/12/22/developers-notes-for-uimenucontroller

person imthi    schedule 03.12.2012
comment
Спасибо дружище, это было здорово! ;-) - person momo; 03.12.2012