пытается добавить готовую кнопку на цифровую клавиатуру - PullRequest
8 голосов
/ 31 января 2012

Я пытаюсь добавить кнопку «Готово» в UIKeyboadnumpad, но безуспешно.Что не так в моем коде?

на клавиатуре нет кнопки "Готово"

@implementation DemoViewController

- (void)loadView {
    self.view = [[UIView alloc] initWithFrame:[UIScreen mainScreen].applicationFrame];
    self.view.backgroundColor = [UIColor groupTableViewBackgroundColor];

    textField = [[UITextField alloc] initWithFrame:CGRectMake(10, 200, 300, 26)];
    textField.borderStyle = UITextBorderStyleRoundedRect;
    textField.keyboardType = UIKeyboardTypeNumberPad;
    textField.returnKeyType = UIReturnKeyDone;
    textField.textAlignment = UITextAlignmentLeft;
    textField.text = @"12345";
    [self.view addSubview:textField];

    [[NSNotificationCenter defaultCenter] addObserver:self 
                                             selector:@selector(keyboardWillShow:) 
                                                 name:UIKeyboardWillShowNotification 
                                               object:nil];
}

- (void)keyboardWillShow:(NSNotification *)note {  
    // create custom button
    UIButton *doneButton = [UIButton buttonWithType:UIButtonTypeCustom];
    doneButton.frame = CGRectMake(0, 163, 106, 53);
    doneButton.adjustsImageWhenHighlighted = NO;
    [doneButton setImage:[UIImage imageNamed:@"DoneUp.png"] forState:UIControlStateNormal];
    [doneButton setImage:[UIImage imageNamed:@"DoneDown.png"] forState:UIControlStateHighlighted];
    [doneButton addTarget:self action:@selector(doneButton:) forControlEvents:UIControlEventTouchUpInside];

    // locate keyboard view
    UIWindow* tempWindow = [[[UIApplication sharedApplication] windows] objectAtIndex:0];
    UIView* keyboard;
    for(int i=0; i<[tempWindow.subviews count]; i++) {
        keyboard = [tempWindow.subviews objectAtIndex:i];
        // keyboard view found; add the custom button to it
        if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 3.2) {
            if([[keyboard description] hasPrefix:@"<UIPeripheralHost"] == YES)
                [keyboard addSubview:doneButton];
        } else {
            if([[keyboard description] hasPrefix:@"<UIKeyboard"] == YES)
                [keyboard addSubview:doneButton];
        }

    }
}

- (void)doneButton:(id)sender {
    NSLog(@"Input: %@", textField.text);
    [textField resignFirstResponder];
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
}

- (void)dealloc {
    [[NSNotificationCenter defaultCenter] removeObserver:self];
    [textField release];
    [super dealloc];
}


@end

Ответы [ 4 ]

27 голосов
/ 08 июля 2012

Другое решение.Идеально, если на экране есть другие текстовые поля без нумерации.

inputAccessoryView

- (void)viewDidLoad
{
    [super viewDidLoad];

    UIToolbar* numberToolbar = [[UIToolbar alloc]initWithFrame:CGRectMake(0, 0, 320, 50)];
    numberToolbar.barStyle = UIBarStyleBlackTranslucent;
    numberToolbar.items = [NSArray arrayWithObjects:
                         [[UIBarButtonItem alloc]initWithTitle:@"Cancel" style:UIBarButtonItemStyleBordered target:self action:@selector(cancelNumberPad)],
                         [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil],
                         [[UIBarButtonItem alloc]initWithTitle:@"Apply" style:UIBarButtonItemStyleDone target:self action:@selector(doneWithNumberPad)],
                     nil];
    [numberToolbar sizeToFit];
    numberTextField.inputAccessoryView = numberToolbar;
}

-(void)cancelNumberPad{
    [numberTextField resignFirstResponder];
    numberTextField.text = @"";
}

-(void)doneWithNumberPad{
    NSString *numberFromTheKeyboard = numberTextField.text;
    [numberTextField resignFirstResponder];
}

Мне понадобилась телефонная панель (с + * #), а нецифровая клавиатура, у меня даже не было пустой кнопки в углу.

1 голос
/ 04 мая 2012

Некоторые учебные пособия являются неполными или намного старше. Этот учебник работает с IOS 4.3 и далее, и я проверил его. Сохраните два графических изображения и вставьте код. Там очень мало, чтобы измениться. Вот ссылка.

пс. Я никоим образом не связан с этой статьей, но нашел, что она завершена.

http://www.neoos.ch/blog/37-uikeyboardtypenumberpad-and-the-missing-return-key

1 голос
/ 31 января 2012

Введите код вашей кнопки добавления в - (void)keyboardDidShow:(NSNotification *)note

вместо

- (void)keyboardWillShow:(NSNotification *)note 

Для этой реализации UIKeyboardDidShowNotification уведомление типа:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardDidShow:) 
                                                     name:UIKeyboardDidShowNotification object:nil];

Я думаю, UIView* keyboard; не видит экран клавиатуры, так как клавиатура еще не отображается, она будет отображаться !!!

0 голосов
/ 29 августа 2013

Чтобы сделать его коротким: сделайте снимок экрана, вырежьте весь ключ возврата, отразите его по горизонтали, очистите его символ возврата в Photoshop и наложите на него текст, который мы хотим на нашей клавише return . Мы выбрали его для маркировки DONE .
Теперь у нас есть изображение для пользовательской кнопки UIControlStateNormal.
Повторите всю процедуру (с нажатой клавишей Backspace при создании снимка экрана), чтобы получить второе изображение для кнопки UIControlStateHighlighted.

Вот результат: <<em> отсутствует изображение >


Теперь вернемся к кодированию:
Для начала нам нужно знать, когда цифровая клавиатура будет скользить вверх по экрану, чтобы мы могли подключить нашу пользовательскую кнопку до того, как это произойдет.
К счастью, есть уведомление именно для этой цели, и зарегистрироваться для него так же просто, как:

[[NSNotificationCenter defaultCenter] addObserver:self 
                                         selector:@selector(keyboardWillShow:) 
                                             name:UIKeyboardWillShowNotification 
                                           object:nil];

Не забудьте удалить наблюдателя из центра уведомлений в соответствующем месте, как только вы закончите со всем этим :

[[NSNotificationCenter defaultCenter] removeObserver:self];

Теперь мы подошли к сути. Все, что нам нужно сделать в методе keyboardWillShow, - это найти вид клавиатуры и добавить к нему нашу кнопку.
Представление клавиатуры является частью второго UIWindow нашего приложения, как уже поняли другие (см. Эту ветку).
Таким образом, мы берем ссылку на это окно (в большинстве случаев это будет второе окно, поэтому objectAtIndex:1 в приведенном ниже коде хорошо), просмотрим его иерархию представлений, пока мы не найдем клавиатуру и не добавим кнопку в ее нижний левый угол:

- (void)keyboardWillShow:(NSNotification *)note {  
    // create custom button
    UIButton *doneButton = [UIButton buttonWithType:UIButtonTypeCustom];
    doneButton.frame = CGRectMake(0, 163, 106, 53);
    doneButton.adjustsImageWhenHighlighted = NO;
    [doneButton setImage:[UIImage imageNamed:@"DoneUp.png"]
                forState:UIControlStateNormal];
    [doneButton setImage:[UIImage imageNamed:@"DoneDown.png"]
                forState:UIControlStateHighlighted];
    [doneButton addTarget:self action:@selector(doneButton:)
         forControlEvents:UIControlEventTouchUpInside];

    // locate keyboard view
    UIWindow* tempWindow = [[[UIApplication sharedApplication] windows]
                                                               objectAtIndex:1];
    UIView* keyboard;
    for(int i=0; i<[tempWindow.subviews count]; i++) {
        keyboard = [tempWindow.subviews objectAtIndex:i];
        // keyboard view found; add the custom button to it
        if([[keyboard description] hasPrefix:@"UIKeyboard"] == YES)
            [keyboard addSubview:doneButton];
    }
}

Вуаля, вот и все!
Пустое пространство для нашей кнопки начинается с координаты (0, 163) и имеет размеры (106, 53).
Конечно, метод doneButton должен быть написан сейчас, но это уже не сложно. Просто убедитесь, что вы вызываете resignFirstResponder в текстовом поле, которое редактируется, чтобы клавиатура сдвинулась вниз.

Мы «СДЕЛАНЫ».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...