Hoe om te laten zien "Done" knop op de iPhone numerieke toetsenblok

stemmen
208

Er is geen Done knop op het toetsenbord. Wanneer een gebruiker klaar is het invoeren van numerieke gegevens in een tekstveld, hoe kan ik het numerieke toetsenblok verdwijnen?

Ik kon een Klaar knop krijgen door het gebruik van het standaard toetsenbord, maar dan kunnen gebruikers zou hebben om over te schakelen naar de numerieke toetsen om cijfers in te voeren. Is er een manier om een ​​Klaar knop op het numerieke toetsenblok te laten zien?

De vraag is gesteld op 25/02/2009 om 03:45
bron van user
In andere talen...                            


21 antwoorden

stemmen
321

Een andere oplossing. Perfect als er andere niet-numeriek toetsenblok tekstvelden op het scherm.

inputAccessoryView

- (void)viewDidLoad
{
    [super viewDidLoad];

    UIToolbar* numberToolbar = [[UIToolbar alloc]initWithFrame:CGRectMake(0, 0, 320, 50)];
    numberToolbar.barStyle = UIBarStyleBlackTranslucent;
    numberToolbar.items = @[[[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)]];
    [numberToolbar sizeToFit];
    numberTextField.inputAccessoryView = numberToolbar;
}

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

-(void)doneWithNumberPad{
    NSString *numberFromTheKeyboard = numberTextField.text;
    [numberTextField resignFirstResponder];
}
antwoordde op 08/07/2012 om 10:26
bron van user

stemmen
37

Hier is een aanpassing voor antwoord Luda's voor Swift:

In de verklaring van uw UIViewController subklasse put

let numberToolbar: UIToolbar = UIToolbar()

in viewDidLoad zetten:

    numberToolbar.barStyle = UIBarStyle.BlackTranslucent
    numberToolbar.items=[
        UIBarButtonItem(title: "Cancel", style: UIBarButtonItemStyle.Bordered, target: self, action: "hoopla"),
        UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.FlexibleSpace, target: self, action: nil),
        UIBarButtonItem(title: "Apply", style: UIBarButtonItemStyle.Bordered, target: self, action: "boopla")
    ]

    numberToolbar.sizeToFit()

    textField.inputAccessoryView = numberToolbar //do it for every relevant textfield if there are more than one 

en het toevoegen van de functies heisa en heisa (voel je vrij om andere namen te kiezen, verander gewoon de selector namen in viewDidLoad dienovereenkomstig

func boopla () {
    textField.resignFirstResponder()
}

func hoopla () {
    textField.text=""
    textField.resignFirstResponder()
}
antwoordde op 24/02/2015 om 22:24
bron van user

stemmen
14

De truc die ik heb gezien gebruikt is om een ​​aangepaste transparante knop van de grootte van de gehele mening te maken en vervolgens in haar klik methode, hebben het tekstveld aftreden first responder. Zo kan de gebruiker op een willekeurige plaats buiten het veld om het toetsenbord te ontslaan.

antwoordde op 25/02/2009 om 05:07
bron van user

stemmen
11

De oplossing in UIKeyboardTypeNumberPad en ontbrekende return toets werkt geweldig, maar alleen als er geen andere niet-numeriek toetsenblok tekstvelden op het scherm.

Ik nam die code en draaide het in een UIViewController dat je gewoon kunt subklasse om ervoor aantal pads werken. U moet de icoontjes te krijgen van de bovenstaande link.

NumberPadViewController.h:

#import <UIKit/UIKit.h>

@interface NumberPadViewController : UIViewController {
    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;

@end

en NumberPadViewController.m:

#import "NumberPadViewController.h"

@implementation NumberPadViewController

@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:@"DoneUp3.png"];
        self.numberPadDoneImageHighlighted = [UIImage imageNamed:@"DoneDown3.png"];
    } else {        
        self.numberPadDoneImageNormal = [UIImage imageNamed:@"DoneUp.png"];
        self.numberPadDoneImageHighlighted = [UIImage imageNamed:@"DoneDown.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 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];
}

@end

Genieten.

antwoordde op 05/08/2010 om 21:16
bron van user

stemmen
9

Hieronder is een revisie van het antwoord van Luda's met de volgende wijzigingen:

  • het accessoire weergave wordt automatisch aangepast aan de breedte van het toepassingskader

  • de verouderde constante UIBarButtonItemStyleBorderedvermeden

  • de "Klaar" knop wordt geconcretiseerd als een UIBarButtonSystemItemDone

Momenteel is de "Klaar" knop in het midden van het accessoire uitzicht. Je kunt het positioneren op links of rechts door het schrappen van de ruimte op de relevante zijde.

Ik heb een knop "Annuleren" weggelaten omdat de standaard toetsenbord men ook niet heeft. Als u wilt dat een knop "Annuleren", stel ik voor dat je het instantiëren als een UIBarButtonSystemItemCancelen dat u ervoor zorgen dat je niet de oorspronkelijke waarde in het tekstveld niet langer gebruikt. De "Cancel" gedrag in antwoord Luda's, die de waarde overschrijft met een lege reeks geïmplementeerd, is misschien niet wat je wilt.

- (void)viewDidLoad {
  [super viewDidLoad];
  float appWidth = CGRectGetWidth([UIScreen mainScreen].applicationFrame);
  UIToolbar *accessoryView = [[UIToolbar alloc]
                              initWithFrame:CGRectMake(0, 0, appWidth, 0.1 * appWidth)];
  UIBarButtonItem *space = [[UIBarButtonItem alloc]
                            initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace
                            target:nil
                            action:nil];
  UIBarButtonItem *done = [[UIBarButtonItem alloc]
                           initWithBarButtonSystemItem:UIBarButtonSystemItemDone
                           target:self
                           action:@selector(selectDoneButton)];
  accessoryView.items = @[space, done, space];
  self.valueField.inputAccessoryView = accessoryView;
}

- (void)selectDoneButton {
  [self.valueField resignFirstResponder];
}

Voor meer informatie over het bouwen van accessoire uitzicht, zie de Apple documentatie over aangepaste weergaven voor gegevensinvoer . U zult waarschijnlijk willen de referentie-pagina's op te raadplegen UIToolbar en UIBarButtonItem ook.

antwoordde op 16/07/2015 om 10:16
bron van user

stemmen
6

Een veel eenvoudigere oplossing

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    [super touchesBegan:touches withEvent:event];

    [textViewInstance1 resignFirstResponder];
    [textViewInstance2 resignFirstResponder];
    [textField resignFirstResponder];
}
antwoordde op 04/08/2011 om 12:01
bron van user

stemmen
6

Hier is de meest recente code. Gewoon omvatten #import "UIViewController + NumPadReturn.h" in uw ViewController.

Hier is de .h

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>

@interface UIViewController (NumPadReturn)



@end

En de .m

#import "UIViewController+NumPadReturn.h"


@implementation UIViewController (NumPadReturn)

-(void) viewDidLoad{
    // add observer for the respective notifications (depending on the os version)
    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];
    }

}


- (void)keyboardWillShow:(NSNotification *)note {
    // if clause is just an additional precaution, you could also dismiss it
    if ([[[UIDevice currentDevice] systemVersion] floatValue] < 3.2) {
        [self addButtonToKeyboard];
    }
}

- (void)keyboardDidShow:(NSNotification *)note {
    // if clause is just an additional precaution, you could also dismiss it
    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 3.2) {
        [self addButtonToKeyboard];
    }
}

- (void)addButtonToKeyboard {
    // create custom button
    UIButton *doneButton = [UIButton buttonWithType:UIButtonTypeCustom];
    doneButton.frame = CGRectMake(0, 163, 106, 53);
    doneButton.adjustsImageWhenHighlighted = NO;
    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 3.0) {
        [doneButton setImage:[UIImage imageNamed:@"DoneUp3.png"] forState:UIControlStateNormal];
        [doneButton setImage:[UIImage imageNamed:@"DoneDown3.png"] forState:UIControlStateHighlighted];
    } else {        
        [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 found, add the button
        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(@"doneButton");
    [self.view endEditing:TRUE];
}



@end
antwoordde op 04/12/2010 om 21:57
bron van user

stemmen
5

Dit forum bericht wordt beschreven hoe u de UIKeyboard te passen aan uw aangepaste weergave toe te voegen aan het toetsenbord.

antwoordde op 25/02/2009 om 05:48
bron van user

stemmen
3

SWIFT 3.0 Een andere smaak, door onderdelen van een aantal eerdere antwoorden.

func addToolbarToNumberPad()
{
    let numberPadToolbar: UIToolbar = UIToolbar()

    numberPadToolbar.isTranslucent = true
    numberPadToolbar.items=[
        UIBarButtonItem(barButtonSystemItem: .cancel, target: self, action: #selector(self.cancelAction)),
        UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: self, action: nil),
        UIBarButtonItem(title: "Custom", style: .done, target: self, action: #selector(self.customAction)),
        UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(self.doneAction)),
    ]

    numberPadToolbar.sizeToFit()

    textField.inputAccessoryView = numberPadToolbar
}

func cancelAction()
{
    textField.resignFirstResponder()
}

func customAction()
{
    textField.resignFirstResponder()
}

func doneAction()
{
    textField.resignFirstResponder()
}

override func viewDidLoad()
{
    super.viewDidLoad()

    self.addToolbarToNumberPad()
}
antwoordde op 11/09/2017 om 11:41
bron van user

stemmen
3

Een Swift 3 -oplossing via een verlengkabel. Ideaal als je meerdere numerieke UITextFieldobjecten in uw app als het de flexibiliteit om te beslissen, voor elk geeft UITextField, of het nu om een aangepaste actie uit te voeren wanneer Gedaan of annuleren wordt afgetapt.

voer image beschrijving hier

//
//  UITextField+DoneCancelToolbar.swift
//

import UIKit

extension UITextField {
    func addDoneCancelToolbar(onDone: (target: Any, action: Selector)? = nil, onCancel: (target: Any, action: Selector)? = nil) {     
        let onCancel = onCancel ?? (target: self, action: #selector(cancelButtonTapped))
        let onDone = onDone ?? (target: self, action: #selector(doneButtonTapped))

        let toolbar: UIToolbar = UIToolbar()
        toolbar.barStyle = .default
        toolbar.items = [
            UIBarButtonItem(title: "Cancel", style: .plain, target: onCancel.target, action: onCancel.action),
            UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: self, action: nil),
            UIBarButtonItem(title: "Done", style: .done, target: onDone.target, action: onDone.action)
        ]
        toolbar.sizeToFit()

        self.inputAccessoryView = toolbar
    }

    // Default actions:  
    func doneButtonTapped() { self.resignFirstResponder() }
    func cancelButtonTapped() { self.resignFirstResponder() }
}

Voorbeeld van gebruik met behulp van de standaard acties:

//
// MyViewController.swift
//

@IBOutlet weak var myNumericTextField: UITextField! {
    didSet { myNumericTextField?.addDoneCancelToolbar() }
}

Toepassingsvoorbeeld gebruik van een aangepaste Gedaan actie:

//
// MyViewController.swift
//

@IBOutlet weak var myNumericTextField: UITextField! {
    didSet { 
        myNumericTextField?.addDoneCancelToolbar(onDone: (target: self, action: #selector(doneButtonTappedForMyNumericTextField))) 
    }
}

func doneButtonTappedForMyNumericTextField() { 
    print("Done"); 
    myNumericTextField.resignFirstResponder() 
}
antwoordde op 19/08/2017 om 11:40
bron van user

stemmen
2

Ik vond het antwoord @ user1258240's vrij beknopt zijn gegeven dit is niet zo eenvoudig als het instellen van een returnKeyTypewoning.

Net wilde mijn eigen "herbruikbare" benadering dragen hieraan bij:

func SetDoneToolbar(field:UITextField) {
    let doneToolbar:UIToolbar = UIToolbar()

    doneToolbar.items=[
        UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.flexibleSpace, target: self, action: nil),
        UIBarButtonItem(title: "Done", style: UIBarButtonItemStyle.plain, target: self, action: #selector(ViewController.dismissKeyboard))
    ]

    doneToolbar.sizeToFit()
    field.inputAccessoryView = doneToolbar
}

override func viewDidLoad() {
    super.viewDidLoad()

    SetDoneToolbar(field: UITextField_1)
    SetDoneToolbar(field: UITextField_2)
    SetDoneToolbar(field: UITextField_3)
    SetDoneToolbar(field: UITextField_N)
}
antwoordde op 04/11/2016 om 05:34
bron van user

stemmen
2

Als u meerdere numerieke velden, stel ik subclassing UITextField een NumericTextField die altijd wordt een numeriek toetsenbord met een uitgemaakte knop te maken. Dan gewoon associëren uw numerieke velden met deze klasse in de Interface Builder en u zult geen extra code nodig in een van uw View Controllers. Het volgende is Swift 3.0 klasse die ik gebruik in Xcode 8.0.

class NumericTextField: UITextField {
   let numericKbdToolbar = UIToolbar()

    // MARK: Initilization
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        self.initialize()
    }

    override init(frame: CGRect) {
        super.init(frame: frame)
        self.initialize()
    }

    // Sets up the input accessory view with a Done button that closes the keyboard
    func initialize()
    {
        self.keyboardType = UIKeyboardType.numberPad

        numericKbdToolbar.barStyle = UIBarStyle.default
        let space = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.flexibleSpace, target: nil, action: nil)
        let callback = #selector(NumericTextField.finishedEditing)
        let donebutton = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.done, target: self, action: callback)
        numericKbdToolbar.setItems([space, donebutton], animated: false)
        numericKbdToolbar.sizeToFit()
        self.inputAccessoryView = numericKbdToolbar
    }

    // MARK: On Finished Editing Function
    func finishedEditing()
    {
        self.resignFirstResponder()
    }
}
antwoordde op 02/10/2016 om 13:07
bron van user

stemmen
2

We kunnen ook de "user raakte somewhere else" oplossing nog eenvoudiger als we gewoon zeggen view our view controller om het bewerken:

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
 { 
      [super touchesBegan:touches withEvent:event];

      [self.view endEditing:YES]; //YES ignores any textfield refusal to resign
 }

... aannemende dat "elders raken verwerpt het toetsenbord" gewenst gedrag van andere bewerkbare velden van het uitzicht.

antwoordde op 06/05/2015 om 23:46
bron van user

stemmen
2

Als je weet van te voren het aantal getallen in te voeren (bijvoorbeeld een 4-cijferige pincode) kon je auto-ontslaan na 4 toetsaanslagen, zoals per mijn antwoord op deze soortgelijke vraag:

ontslaan Number Pad

Geen behoefte aan een extra gedaan knop in dit geval.

antwoordde op 16/05/2013 om 14:50
bron van user

stemmen
2

Ik wijzigde oplossing Bryan's om een ​​beetje meer robuust zijn, zodat het mooi zou spelen met andere vormen van toetsenborden die in hetzelfde uitzicht kon verschijnen. Het is hier beschreven:

Maak een DONE knop op de iOS numpad UIKeyboard

Ik zou proberen om het hier uit te leggen, maar het meeste is de code om naar te kijken, dat zou ik hier niet past gemakkelijk

antwoordde op 04/10/2012 om 08:38
bron van user

stemmen
2

Hier is de eenvoudigste oplossing die ik ben tegengekomen. Ik heb dit geleerd van Beginning iOS 5 Development boek.

Ervan uitgaande dat de nummer veld wordt genoemd numberField.

  1. In ViewController, voeg de volgende methode:

    -(IBAction)closeKeyboard:(id)sender;
    
  2. In ViewController.m, voeg de volgende code:

    -(IBAction)closeKeyboard:(id)sender
    {
    
         [numberField resignFirstResponder];
    
    }
    
  3. Ga terug naar nibhet bestand.

  4. Open Utilitiespan.
  5. Open de Identity inspectoronder de Utilitiespan.
  6. Klik op de View(in nib-bestand) een keer. Zorg ervoor dat je niet hebt geklikt op een van de items in de weergave. Omwille van de duidelijkheid, moet je UIView zie onder Classin Identity inspector.
  7. Wijzig de klasse van UIView naar UIControl.
  8. Open Connection Inspector.
  9. Klik en sleep Touch Downen neerzetten van de pijl op File Ownerhet pictogram. (FYI ... dossiereigenaar pictogram wordt links van Viewen weergegeven als een holle kubus met geel kader).
  10. Selecteer de methode: closeKeyboard.
  11. Start het programma.

Als u nu op een willekeurige plek op de achtergrond van View, moet u in staat om het toetsenbord te ontslaan.

Hoop dat dit helpt u uw probleem op te lossen. :-)

antwoordde op 12/09/2012 om 16:07
bron van user

stemmen
2

De eenvoudigste manier is:

Maak aangepaste transparante knop en plaats deze in de linker beneden hoek, die hetzelfde zal hebben CGSizeals lege ruimte in UIKeyboardTypeNumberPad. Toggle (toon / verberg) deze knop op textField becomeFirstResponder, op de knop klikt, respectievelijk.

antwoordde op 26/06/2012 om 12:44
bron van user

stemmen
2

Beschrijf ik een oplossing voor iOS 4.2+ hier maar verwerpen knop verdwijnt na het toetsenbord verschijnt. Het is niet verschrikkelijk, maar niet ideaal is.

De in de vraag gekoppeld boven beschreven oplossing een elegantere illusie op, waar ik fade verwerpen en verticaal verplaatst de knop om de schijn dat het toetsenbord en de knop elkaar afwijzing te verschaffen.

antwoordde op 23/04/2011 om 22:28
bron van user

stemmen
1

Voor Swift 2.2 gebruik ik deze

func addDoneButtonOnKeyboard() {
    let doneToolbar: UIToolbar = UIToolbar(frame: CGRectMake(0, 0, self.view.bounds.size.width, 50))

    let flexSpace = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.FlexibleSpace, target: nil, action: nil)
    let done: UIBarButtonItem = UIBarButtonItem(title: "Done", style: UIBarButtonItemStyle.Done, target: self, action: #selector(DetailViewController.finishDecimalKeypad))

    var items: [UIBarButtonItem]? = [UIBarButtonItem]()
    items?.append(flexSpace)
    items?.append(done)

    doneToolbar.items = items
    doneToolbar.sizeToFit()
    self.productPrice.inputAccessoryView=doneToolbar
}

func finishDecimalKeypad() {
    self.productPrice?.resignFirstResponder()
}
antwoordde op 04/05/2016 om 08:23
bron van user

stemmen
0

Swift 2.2 / I gebruikte antwoord Dx_'s. Maar ik wilde deze functionaliteit op alle toetsenborden. Dus in mijn basisklasse Ik zet de code:

func addDoneButtonForTextFields(views: [UIView]) {
    for view in views {
        if let textField = view as? UITextField {
            let doneToolbar = UIToolbar(frame: CGRectMake(0, 0, self.view.bounds.size.width, 50))

            let flexSpace = UIBarButtonItem(barButtonSystemItem: .FlexibleSpace, target: nil, action: nil)
            let done = UIBarButtonItem(title: "Done", style: .Done, target: self, action: #selector(dismissKeyboard))

            var items = [UIBarButtonItem]()
            items.append(flexSpace)
            items.append(done)

            doneToolbar.items = items
            doneToolbar.sizeToFit()

            textField.inputAccessoryView = doneToolbar
        } else {
            addDoneButtonForTextFields(view.subviews)
        }
    }
}

func dismissKeyboard() {
    dismissKeyboardForTextFields(self.view.subviews)
}

func dismissKeyboardForTextFields(views: [UIView]) {
    for view in views {
        if let textField = view as? UITextField {
            textField.resignFirstResponder()
        } else {
            dismissKeyboardForTextFields(view.subviews)
        }
    }
}

Dan gewoon bellen addDoneButtonForTextFields op self.view.subviews in viewDidLoad (of willDisplayCell bij gebruik van een tabel weergave) op de knop Gereed toe te voegen aan alle toetsenborden.

antwoordde op 23/08/2016 om 17:09
bron van user

stemmen
0

Al die implementatie over het vinden van het toetsenbord uitzicht en het toevoegen van de knop Gereed op de 3e rij (dat is de reden waarom hoogte button.y = 163 b / c keyboard is 216) zijn kwetsbaar, omdat iOS houdt verandert het uitzicht hiërarchie. Bijvoorbeeld geen van bovenstaande codes werken voor iOS9.

Ik denk dat het veilig is om gewoon de bovenste uitzicht, door [[[UIApplication sharedApplication] windows] lastObject], en voeg gewoon op de knop linksonder in het, doneButton.frame = CGRectMake (0, SCREEN_HEIGHT-53, 106 , 53); // portretmodus

antwoordde op 07/12/2015 om 09:36
bron van user

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more