Отображать UIMenuController в editDidBegin UITextField

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

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

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

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


person yinkou    schedule 01.07.2012    source источник
comment
Вы установили элементы меню для общего контроллера меню?   -  person xingzhi.sg    schedule 09.07.2012
comment
Да, я сделал, но даже если это не так, должен показать стандартный.   -  person yinkou    schedule 09.07.2012
comment
Почему вы используете IBAction вместо обычного метода делегата? Вы вручную связываете действия в XIB?   -  person marzapower    schedule 09.07.2012
comment
Потому что текстовое поле не имеет делегата.   -  person yinkou    schedule 09.07.2012
comment
Вы наверняка можете установить делегата для UITextField, используя протокол UITextFieldDelegate. На самом деле, мое тестовое приложение использует главный контроллер в качестве делегата для обработки событий из текстового поля.   -  person marzapower    schedule 09.07.2012
comment
Ты прав, блин. Моя вина. ;Д   -  person yinkou    schedule 09.07.2012


Ответы (2)


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

Вы можете легко сделать так, чтобы 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, чтобы убедиться, что меню отображается после завершения всех системных вызовов по умолчанию на 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];
}

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

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

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

- (void)textFieldDidBeginEditing:(UITextField *)textField
{
    [[NSOperationQueue mainQueue] addOperationWithBlock:^{
        [textField select:nil];
        UIMenuController *menuController = [UIMenuController sharedMenuController];
        [menuController setMenuVisible:YES animated:YES];
    }];
}
person Rudolf Adamkovič    schedule 16.02.2013