Nano Hash - криптовалюты, майнинг, программирование

Проблемы с отображением UIMenuController при касании ячейки в UITableView

Я пытаюсь отобразить пользовательский 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 для Edit и Save просто отображают 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

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

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

Настроить UIMenuController

23.11.2010
  • У меня есть это. В файле реализации MyViewController - (BOOL) canBecomeFirstResponder {return YES; } 23.11.2010
  • Но вам нужно вызвать [someView статьFirstResponder], чтобы стать первым респондентом. 23.11.2010
  • UIMenuController использует представление firstResponder в качестве отправной точки для отправки сообщений. Если первый респондент не активен, он не будет отображать меню. Представление, к которому относится ваше меню, необходимо сделать первым респондентом, вызвав статьFirstResponder. 23.11.2010
  • Да, я забыл обработать это в методе handleLongGesture. Спасибо за вашу помощь и справочное руководство. 23.11.2010
  • Основываясь на приведенном выше коде, видите ли вы какую-либо причину, по которой отображаемый MenuController размещается около середины представления, а не там, где произошло долгое нажатие? 23.11.2010
  • Размещение определяется представлением, имеющим статус firstResponder. Это не имеет ничего общего с какими-либо событиями касания, которые могли произойти. Но вы можете предоставить прямоугольную область, к которой применяется меню. См. - (void) setTargetRect: (CGRect) targetRect inView: (UIView *) targetView 23.11.2010
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..