Вопрос по ios, objective-c, uitextfield, cocoa-touch, uimenucontroller – Отобразить UIMenuController в режиме editDidBegin для UITextField

1

Я просто хочу отобразить UIMenuController сразу после того, как текстовое поле стало активным.
То, что я сейчас делаю, это:

- (IBAction)textFieldeditingDidBegin:(UITextField *)sender {
    // textfield menu item
    UIMenuController *menu = [UIMenuController sharedMenuController];
    [menu setTargetRect:sender.frame inView:self.view];
    [menu setMenuVisible:YES animated:YES];
}

Метод вызывается, но он просто не будет отображать меню ...
Если я делаю жест касания + удержания в текстовом поле, он появляется регулярно.

Я надеюсь, что для этого есть простое решение, Спасибо

Почему вы используетеIBAction вместо метода обычного делегата? Вы вручную связываете действия в XIB? marzapower
Поскольку текстовое поле не имеет делегата. yinkou
Да, я сделал, но даже если это не так, должен показать стандарт. yinkou
Вы установили элементы меню для sharedMenuController? xingzhi.sg
Вы можете, конечно, установить делегата дляUITextField с использованиемUITextFieldDelegate протокол. Фактически, мое тестовое приложение использует основной контроллер в качестве делегата для обработки событий из текстового поля. marzapower

Ваш Ответ

2   ответа
2

Более простое решение:

- (void)textFieldDidBeginEditing:(UITextField *)textField
{
    [[NSOperationQueue mainQueue] addOperationWithBlock:^{
        [textField select:nil];
        UIMenuController *menuController = [UIMenuController sharedMenuController];
        [menuController setMenuVisible:YES animated:YES];
    }];
}
7

Я нашел хорошее решение вашего вопроса.

Вы можете легко сделатьUIMenuController появляются, когда вы начинаете редактировать текстовое поле с помощью этого метода:

- (void)textFieldDidBeginEditing:(UITextField *)textField
{
    double delayInSeconds = 0.1;
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
    dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
        UIMenuController *menu = [UIMenuController sharedMenuController];
        [menu setTargetRect:textField.frame inView:textField.superview];
        [menu setMenuItems:[NSArray arrayWithObjects:
                            [[UIMenuItem alloc] initWithTitle:@"Test" action:@selector(test)],
                            nil]];
        [menu setMenuVisible:YES animated:YES];
    });
}

Я используюdispatch_after позвоните, чтобы убедиться, что меню отображаетсяafter все системные вызовы по умолчанию наUITextField завершены.

Я также изменилinView:self.view частьsetTargetRect:: метод сinView:textField.superview чтобы убедиться, что меню отображается правильно в представлении контейнера текстового поля.

Если вы также хотите отключить элементы меню по умолчанию дляUITextField Вы можете добавить этот метод в свой контроллер:

- (BOOL)canPerformAction:(SEL)action withSender:(id)sender
{
    if (action == @selector(cut:))
        return NO;
    else if (action == @selector(copy:))
        return NO;
    else if (action == @selector(paste:))
        return NO;
    else if (action == @selector(select:) || action == @selector(selectAll:))
        return NO;
    else
        return [super canPerformAction:action withSender:sender];
}

Эта работа действительно хорошо работает в симуляторе. Я надеюсь, что это поможет вам!

@yinkou, извините, но в исходном коде моего тестового приложения была опечатка. Вы правы, вы можете иметь оба элемента управления одновременно. Основной метод работает правильно :) Я обновил ответ, чтобы отразить эти изменения.
& quot; Хотя доступны элементы управления по умолчанию для UITextField, все настройки UIMenuController не будут работать. Явно отключив их, вы можете отобразить все, что вы хотите, в вашем контроллере меню. & Quot; - & GT; Неправильно, это работает. Я нуждаюсь в них, поэтому я не буду реализовывать вашу первую часть. Но второе звучит хорошо, я попробую сегодня. yinkou

Похожие вопросы