2010-06-10 10 views
24

Ich möchte eine Schaltfläche "Fertig" auf der Tastatur des iPhone-Nummernblocks hinzufügen. Es gibt sogar einen handlichen Platz in der unteren linken Ecke für genau solch einen Knopf.Wie wird der Knopf 'Fertig' auf dem Nummernblock auf dem iPhone OS 4 angezeigt?

Früher habe ich einen ähnlichen Trick wie in Question 584538 und Luzian Scherrer's excellent blog post beschrieben, aber das funktioniert nicht mehr in iOS 4. Ich kann es tun, indem ich eine benutzerdefinierte inputView, aber ich würde lieber Apple-Tastatur statt zu schreiben erweitern mein eigenes.

Gibt es eine neue Möglichkeit, der Standardtastatur eine Ansicht hinzuzufügen? Hat jemand dafür ein OSS inputView veröffentlicht? Gibt es eine andere Art und Weise?

Antwort

3

Die in Luzian Scherrer's blog postbeschriebene Technik funktioniert in iOS 4.0.

Mein Code zum Hinzufügen der Schaltfläche zur Tastatur schlug fehl, weil sie von der Delegatenmethode textFieldDidBeginEditing: aufgerufen wurde, die (in 4.0) aufgerufen wird, bevor die Unteransichten des Tastaturfensters erstellt werden. Ich habe das Problem behoben, indem ich meinen Code anrufe, wenn UIKeyboardWillShowNotification beobachtet wird, was spät genug passiert.

+0

dies nicht funktioniert auf 4.2. – WrightsCS

+1

Ich habe das gleiche Problem mit 4.2. Warum ist das so kompliziert?!?! APFEL?!? – AYBABTU

+1

In meiner App habe ich zwei Textfelder. Einer zeigt Nummernblock und ein anderes Textfeld zeigt normale Alphabete Tastatur. Ich möchte Done-Taste nur für Nummernblock haben. Wie kann ich es für die normale Tastatur verhindern? – Satyam

6

Ich habe das funktioniert. Sehen Sie den Code hier: http://gist.github.com/454844

gab es zwei Probleme:

  1. UIKeyboardWillShowNotification gesendet wird, bevor die Tastatur Ansicht existiert, aber es Sie planen Ihren Code auf den nächsten Lauf Schleifendurchlauf zu laufen, sie existieren. Sie müssen sich also nicht mit DidShow abgeben, was optisch weniger erfreulich ist.

  2. Auf iOS 4 befand sich die UIKeyboard Ansicht an einer anderen Stelle in der Ansichtshierarchie.

+0

du hast mich gerettet! ... – mshsayem

+0

Ich bevorzuge Ihre Lösung als mit InputAccessoryView. Genial! Danke für das Teilen! – Mathieu

2

Ich habe dies bei Apple als Fehler eingereicht. Interface Builder ermöglicht dem Entwickler, einen Return-Key-Typ für einen Tastaturtyp von Number Pad anzugeben. Fehlernummer 8759674.

von Apple gefolgt, indem er sagte, dass dieses Problem früher als Bug-ID # 5885964 angemeldet wurde und sie geschlossen 8759674.

1

Sie diesen Tastaturcode benachrichtigen verwenden für die Herstellung erfolgte Taste auf Nummer keypad.You Laden Sie einfach done.png Bild an Ihrem Ende herunter.

In .h-Datei

{  //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; 

In .m-Datei

@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

ich habe eine Version erstellt, die horizontale Version des ... numpad Steckers in die Technik in Luzian Scherrer-Blog und fügen Sie die beiden zusätzlichen pngs (hier nicht enthalten) beschrieben zu ermöglichen, und die „isLandscape“ boolean in „didRotateFromInterfaceOrientation“ Methode ..

@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

Sie inputAccessoryView hinzufügen können mit ‚Übernehmen‘ und ‚Abbrechen‘ Tasten und mit dann das Zahlenfeld entlassen.

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

Danke, es hat wirklich geholfen –

+1

Sie sind herzlich willkommen :) – Luda

+0

Erstaunlich! danke –