2010-06-10 2 views
24

Я хотел бы добавить кнопку «Готово» на клавиатуру с цифровым клавиатурой iPhone. Там есть даже удобное место в нижней левой части для такой кнопки.Как показать кнопку «Готово» на цифровой клавиатуре на iPhone OS 4?

Раньше я использовал подобный трюк с описанным в Question 584538 и Luzian Scherrer's excellent blog post, но перестал работать в прошивкой 4. Я могу сделать это путем создания пользовательского inputView, но я бы предпочел, чтобы расширить клавиатуру Apple, вместо написания мой собственный.

Есть ли новый способ добавить представление к стандартной клавиатуре? Кто-то опубликовал входной файл OSS для этого? Есть ли другой способ?

ответ

3

Техника, описанная в Luzian Scherrer's blog post Работа в iOS 4.0.

Мой код для добавления кнопки на клавиатуре был неудачным, потому что он вызывался из метода делегата textFieldDidBeginEditing:, который (в 4.0) вызывается до того, как создаются подзоны окна клавиатуры. Я исправил проблему, вызвав мой код, когда наблюдается UIKeyboardWillShowNotification, что происходит достаточно поздно.

+0

это не работает на 4.2. – WrightsCS

+1

У меня такая же проблема с 4.2. Почему это так сложно?!?! ЯБЛОКО?!? – AYBABTU

+1

В моем приложении у меня есть два текстовых поля. На экране появится номерная панель, а в другом текстовом поле будет отображаться обычная клавиатура алфавитов. Я хочу иметь кнопку «Готово» только для цифровой клавиатуры. как я могу предотвратить его для обычной клавиатуры? – Satyam

6

Я получил эту работу. Смотрите код здесь: http://gist.github.com/454844

Были два вопроса:

  1. UIKeyboardWillShowNotification посылается перед видом клавиатуры существует, но вы планировать свой код для запуска на следующем проходе цикла выполнения, они существуют. Поэтому вам не нужно беспокоиться о DidShow, который визуально менее приятен.

  2. На iOS 4 вид UIKeyboard был в другом месте в иерархии представлений.

+0

u спас меня! ... – mshsayem

+0

Я предпочитаю ваше решение, чем использование inputAccesoryView. Потрясающие! Спасибо, что поделился! – Mathieu

2

Я представил это Apple в качестве ошибки. Интерфейс Builder позволяет разработчику указывать тип возвращаемого ключа для клавиатуры типа Number Pad. номер ошибки 8759674.

Apple, а затем, сказав, что этот вопрос был ранее зарегистрирован как ошибка ID # 5885964, и они закрыли 8759674.

1

Вы можете использовать эту клавиатуру уведомит код для создания кнопки Готово на номере keypad.You нужно просто загрузить done.png изображение в конце.

В файле .h

{  //Keyboard Hide 
UIImage *numberPadDoneImageNormal; 
UIImage *numberPadDoneImageHighlighted; 
UIButton *numberPadDoneButton; 
} 

@property (nonatomic, retain) UIImage *numberPadDoneImageNormal; 
@property (nonatomic, retain) UIImage *numberPadDoneImageHighlighted; 
@property (nonatomic, retain) UIButton *numberPadDoneButton; 

- (IBAction)numberPadDoneButton:(id)sender; 

В .m файл

@synthesize numberPadDoneImageNormal; 
@synthesize numberPadDoneImageHighlighted; 
@synthesize numberPadDoneButton; 

- (id)initWithNibName:(NSString *)nibName bundle:(NSBundle *)nibBundle { 
if ([super initWithNibName:nibName bundle:nibBundle] == nil) 
    return nil; 
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 3.0) { 
    self.numberPadDoneImageNormal = [UIImage imageNamed:@"NumberDone.png"]; 
    self.numberPadDoneImageHighlighted = [UIImage imageNamed:@"NumberDone.png"]; 
} else {   
    self.numberPadDoneImageNormal = [UIImage imageNamed:@"NumberDone.png"]; 
    self.numberPadDoneImageHighlighted = [UIImage imageNamed:@"NumberDone.png"]; 
}   
return self; 
} 

- (void)viewWillAppear:(BOOL)animated { 
[super viewWillAppear:animated]; 

// Add listener for keyboard display events 
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 3.2) { 
    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(keyboardDidShow:) 
               name:UIKeyboardDidShowNotification 
               object:nil];  
} else { 
    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(keyboardWillShow:) 
               name:UIKeyboardWillShowNotification 
               object:nil]; 
} 

// Add listener for all text fields starting to be edited 
[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(textFieldDidBeginEditing:) 
              name:UITextFieldTextDidBeginEditingNotification 
              object:nil]; 
} 

- (void)viewWillDisappear:(BOOL)animated { 
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 3.2) { 
    [[NSNotificationCenter defaultCenter] removeObserver:self 
                name:UIKeyboardDidShowNotification 
                object:nil];  
} else { 
    [[NSNotificationCenter defaultCenter] removeObserver:self 
                name:UIKeyboardWillShowNotification 
                object:nil]; 
} 
[[NSNotificationCenter defaultCenter] removeObserver:self 
               name:UITextFieldTextDidBeginEditingNotification 
               object:nil]; 
[super viewWillDisappear:animated]; 
} 

- (UIView *)findFirstResponderUnder:(UIView *)root { 
if (root.isFirstResponder) 
    return root;  
for (UIView *subView in root.subviews) { 
    UIView *firstResponder = [self findFirstResponderUnder:subView];   
    if (firstResponder != nil) 
     return firstResponder; 
} 
return nil; 
} 

- (UITextField *)findFirstResponderTextField { 
UIResponder *firstResponder = [self findFirstResponderUnder:[self.view window]]; 
if (![firstResponder isKindOfClass:[UITextField class]]) 
    return nil; 
return (UITextField *)firstResponder; 
} 

- (void)updateKeyboardButtonFor:(UITextField *)textField { 

// Remove any previous button 
[self.numberPadDoneButton removeFromSuperview]; 
self.numberPadDoneButton = nil; 

// Does the text field use a number pad? 
if (textField.keyboardType != UIKeyboardTypeNumberPad) 
    return; 

// If there's no keyboard yet, don't do anything 
if ([[[UIApplication sharedApplication] windows] count] < 2) 
    return; 
UIWindow *keyboardWindow = [[[UIApplication sharedApplication] windows] objectAtIndex:1]; 

// Create new custom button 
self.numberPadDoneButton = [UIButton buttonWithType:UIButtonTypeCustom]; 
self.numberPadDoneButton.frame = CGRectMake(0, 163, 106, 53); 
self.numberPadDoneButton.adjustsImageWhenHighlighted = FALSE; 
[self.numberPadDoneButton setTitle:@"Return" forState:UIControlStateNormal]; 
[self.numberPadDoneButton setFont:[UIFont boldSystemFontOfSize:18]]; 
[self.numberPadDoneButton setTitleColor:[UIColor colorWithRed:77.0f/255.0f green:84.0f/255.0f blue:98.0f/255.0f alpha:1.0] forState:UIControlStateNormal]; 

[self.numberPadDoneButton setImage:self.numberPadDoneImageNormal forState:UIControlStateNormal]; 
[self.numberPadDoneButton setImage:self.numberPadDoneImageHighlighted forState:UIControlStateHighlighted]; 
[self.numberPadDoneButton addTarget:self action:@selector(numberPadDoneButton:) forControlEvents:UIControlEventTouchUpInside]; 

// Locate keyboard view and add button 
NSString *keyboardPrefix = [[[UIDevice currentDevice] systemVersion] floatValue] >= 3.2 ? @"<UIPeripheralHost" : @"<UIKeyboard"; 
for (UIView *subView in keyboardWindow.subviews) { 
    if ([[subView description] hasPrefix:keyboardPrefix]) { 
     [subView addSubview:self.numberPadDoneButton]; 
     [self.numberPadDoneButton addTarget:self action:@selector(numberPadDoneButton:) forControlEvents:UIControlEventTouchUpInside]; 
     break; 
    } 
} 
} 

- (void)textFieldDidBeginEditing:(NSNotification *)note { 
[self updateKeyboardButtonFor:[note object]]; 
} 

- (void)keyboardWillShow:(NSNotification *)note { 
[self updateKeyboardButtonFor:[self findFirstResponderTextField]]; 
} 

- (void)keyboardDidShow:(NSNotification *)note { 
[self updateKeyboardButtonFor:[self findFirstResponderTextField]]; 
} 

- (IBAction)numberPadDoneButton:(id)sender { 
UITextField *textField = [self findFirstResponderTextField]; 
[textField resignFirstResponder]; 
} 

- (void)dealloc { 
[numberPadDoneImageNormal release]; 
[numberPadDoneImageHighlighted release]; 
[numberPadDoneButton release]; 
[super dealloc]; 
} 
1

Я создал версию, чтобы включить горизонтальную версию NumPad ... штепсель в методике, описанной в блоге Luzian Шеррера и добавить два дополнительных PNGs (не включены), и логическое «isLandscape» в методе «didRotateFromInterfaceOrientation» ..

@interface AlarmController() 
    { 
     CGRect doneButtnRectVert; 
     CGRect doneButtnRectHorz; 
     CGRect doneButtnRect; 
     UIImage* DoneUpVert; 
     UIImage* DoneDownVert; 
     UIImage* DoneUpHorz; 
     UIImage* DoneDownHorz; 
     UIImage* DoneUp; 
     UIImage* DoneDown; 
     UIButton *oldDoneButton; 
    } 
    @end 

    //--------------------------------------------------------------------------- 
    - (void)viewDidUnload 
    { 
    NSLog(@"viewDidUnload AlarmController"); 
     [[NSNotificationCenter defaultCenter] removeObserver:self 
             name:UIKeyboardDidShowNotification object:nil]; 

     [super viewDidUnload]; 
    } 

    //--------------------------------------------------------------------------- 
    - (void)addButtonToKeyboard 
    { 
    NSLog(@"addButtonToKeyboard AlarmController"); 
     if (isLandscape) 
     { 
      doneButtnRect = doneButtnRectHorz; 
      DoneUp = DoneUpHorz; 
      DoneDown = DoneDownHorz; 
     } else { 
      doneButtnRect = doneButtnRectVert; 
      DoneUp = DoneUpVert; 
      DoneDown = DoneDownVert; 
     } 

     UIButton *doneButton = [UIButton buttonWithType:UIButtonTypeCustom]; 
     doneButton.frame = doneButtnRect; 
     doneButton.adjustsImageWhenHighlighted = NO; 
     [doneButton setImage:DoneUp forState:UIControlStateNormal]; 
     [doneButton setImage:DoneDown forState:UIControlStateHighlighted]; 

     [doneButton addTarget:self action:@selector(done:) forControlEvents:UIControlEventTouchUpInside]; 

     UIWindow* tempWindow = [[[UIApplication sharedApplication] windows] objectAtIndex:1]; 
     UIView* keyboard; 
     for(int i=0; i<[tempWindow.subviews count]; i++) 
     { 
      keyboard = [tempWindow.subviews objectAtIndex:i]; 
      if([[keyboard description] hasPrefix:@"<UIPeripheralHost"] == YES) 
      { 
       if (oldDoneButton) [oldDoneButton removeFromSuperview]; 
       [keyboard addSubview:doneButton]; 
      } 
     } 
     oldDoneButton = doneButton; 
    } 

    //--------------------------------------------------------------------------- 
    - (void)keyboardDidShow:(NSNotification *)note 
    { 
    NSLog(@"keyboardDidShow AlarmController"); 
     [self addButtonToKeyboard]; 
    } 

    #pragma mark - 
    #pragma mark meaty area... 

//--------------------------------------------------------------------------- 
- (void)textFieldDidEndEditing:(UITextField *)textField 
{ 
NSLog(@"textFieldDidEndEditing AlarmController"); 
    oldDoneButton = nil; 
} 

    //--------------------------------------------------------------------------- 
    - (void)viewDidLoad 
    { 
    NSLog(@"viewDidLoad AlarmController"); 
     [super viewDidLoad]; 
     doneButtnRectVert = CGRectMake(0, 163, 106, 53); 
     doneButtnRectHorz = CGRectMake(0, 122, 159, 40); 
     DoneUpVert = [UIImage imageNamed:@"DoneUp3.png"]; 
     DoneDownVert = [UIImage imageNamed:@"DoneDown3.png"]; 
     DoneUpHorz = [UIImage imageNamed:@"DoneUpHor.png"]; 
     DoneDownHorz = [UIImage imageNamed:@"DoneDnHor.png"]; 

     doneButtnRect = doneButtnRectVert; 
     DoneUp = DoneUpVert; 
     DoneDown = DoneDownVert; 
     oldDoneButton = nil; 

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

Вы можете добавить inputAccessoryView с «Применить» и «Отмена» кнопки, и смещать цифровую клавиатуру с потом.

inputAccessoryView

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    UIToolbar* numberToolbar = [[UIToolbar alloc]initWithFrame:CGRectMake(0, 0, 320, 50)]; 

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

    numberTextField.inputAccessoryView = numberToolbar; 
} 

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

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

Спасибо, это действительно помогло –

+1

Добро пожаловать :) – Luda

+0

Удивительно! спасибо –

Смежные вопросы