कैसे iPhone नंबर पैड पर "पूरा" बटन दिखाने के लिए


237

नंबर पैड पर कोई "Done" बटन नहीं है। जब कोई उपयोगकर्ता किसी पाठ क्षेत्र में संख्यात्मक जानकारी दर्ज करता है, तो मैं नंबर पैड को कैसे गायब कर सकता हूं?

मुझे डिफ़ॉल्ट कीबोर्ड का उपयोग करके "डन" बटन मिल सकता है, लेकिन तब उपयोगकर्ताओं को इनपुट नंबरों के लिए संख्यात्मक कुंजियों पर स्विच करना होगा। क्या नंबर पैड पर "डन" बटन दिखाने का कोई तरीका है?

जवाबों:


339

एक और समाधान। स्क्रीन पर अन्य गैर-संख्या पैड पाठ फ़ील्ड हैं, तो सही।

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

1
इसे पूरा करने का सबसे अच्छा तरीका कोई संदेह नहीं है। स्पष्ट रूप से क्योंकि यह सेब को सख्त एचआईजी का पालन करता है।
ह्यूबर्ट कुनमनीयर

3
ऑनस्क्रीन कीबोर्ड के किसी भी ग्राफिकल बदलाव के मामले में अन्य समाधान बहुत भंगुर है।
कैलून

यदि कई टेक्स्ट फ़ील्ड हैं, तो मैं कैसे निर्धारित करूं कि कौन सा UITextField संपादित किया जा रहा है?
नैट

एक उदाहरण चर के रूप में अपने .IT को UITextField परिभाषित करें।
लूडा

3
@BenPotter आप पाठ के लिए बार रंग और रंग रंग के लिए पट्टी सेट करेंगे। आप UIBarButton आइटम को इंटेस्टाइज़र के बाहर भी बना सकते हैं और वहां उनके लिए रंग स्पष्ट रूप से सेट कर सकते हैं।
ocross

50

यहाँ स्विफ्ट के लिए लुडा के उत्तर के लिए एक अनुकूलन है:

अपने UIViewController उपवर्ग की घोषणा में डाल दिया

let numberToolbar: UIToolbar = UIToolbar()

ViewDidLoad में डाल दिया:

    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 

और फ़ंक्शंस को हूपला और हूपला में जोड़ें (अन्य नामों को चुनने के लिए स्वतंत्र महसूस करें, बस ViewDelco में चयनकर्ता नाम बदलें।

func boopla () {
    textField.resignFirstResponder()
}

func hoopla () {
    textField.text=""
    textField.resignFirstResponder()
}

1
UIBarButtonItemStyle.BorderedIOS 8.0 के बाद से पदावनत किया गया है। UIBarButtonItemStyle.Plainके बजाय सुझाव दिया है।
जॉनी

चयनकर्ताओं को अपडेट किया जाना चाहिए: #selector (YourViewController.boopla)
डेविड वी

जॉनी और डेविड शायद सही हैं। मैं अब iOS के लिए प्रोग्रामिंग नहीं कर रहा हूं इसलिए मैं परिवर्तनों का पालन नहीं करता हूं। अगर किसी ने एक अद्यतन समाधान पोस्ट किया है तो मैं इसे एक संपादन में संदर्भित करूंगा।
user1258240

14

मैंने जो ट्रिक देखी है वह कस्टम पारदर्शी बटन को पूरे दृश्य का आकार बनाने के लिए है और फिर इसकी क्लिक विधि में, टेक्स्ट फ़ील्ड को पहले उत्तरदाता से इस्तीफा देना है। तो उपयोगकर्ता कीपैड को खारिज करने के लिए क्षेत्र के बाहर कहीं भी क्लिक कर सकता है।


3
मैंने यह रिटर्न की के अलावा किया है। यह बहुत अधिक उपयोगकर्ता के अनुकूल ऐप के लिए बनाता है। मुझे रिटर्न कीज और क्लिक रिटर्न के तरीके दोनों देना पसंद है।
IcyBlueRose

4
अब जब हमारे पास UIGestureRecognizers हैं, तो बस मुख्य इशारे पर देखने वाले के दृश्य पर एक टैप जेस्चर पहचानकर्ता सेट करें और इसे एंडेडिटिंग भेजें: यह देखने के लिए हां। यह हर टेक्स्टफील्ड के लिए कीबोर्ड को बंद कर देगा कि कीबोर्ड के बाहर टच करने पर कीबोर्ड सर्विसिंग हो सकता है।
chadbag

14

एक एक्सटेंशन का उपयोग करके एक स्विफ्ट 3 समाधान। आदर्श यदि UITextFieldआपके ऐप में कई संख्यात्मक वस्तुएं हैं क्योंकि यह तय करने की सुविधा देता है कि प्रत्येक के लिए UITextField, क्या एक कस्टम एक्शन करना है जब डन या कैंसल टैप किया गया हो।

यहां छवि विवरण दर्ज करें

//
//  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() }
}

डिफ़ॉल्ट क्रियाओं का उपयोग करके उपयोग का उदाहरण:

//
// MyViewController.swift
//

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

एक कस्टम का उपयोग कर उपयोग के उदाहरण हो गया कार्रवाई:

//
// MyViewController.swift
//

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

func doneButtonTappedForMyNumericTextField() { 
    print("Done"); 
    myNumericTextField.resignFirstResponder() 
}

12

नीचे दिए गए परिवर्तनों के साथ लुडा के उत्तर का एक ओवरहाल है:

  • गौण दृश्य स्वचालित रूप से एप्लिकेशन फ़्रेम की चौड़ाई के आकार का है

  • पदावनत स्थिरांक UIBarButtonItemStyleBorderedसे बचा जाता है

  • "पूर्ण" बटन को एक के रूप में त्वरित किया जाता है UIBarButtonSystemItemDone

वर्तमान में "संपन्न" बटन गौण दृश्य में केंद्रित है। आप इसे बायीं ओर या दाईं ओर स्थित स्थान से हटाकर पोजीशन पर रख सकते हैं।

मैंने "रद्द करें" बटन छोड़ दिया है क्योंकि डिफ़ॉल्ट कीबोर्ड में एक भी नहीं है। यदि आप एक "रद्द करें" बटन चाहते हैं, तो मेरा सुझाव है कि आप इसे एक के रूप में त्वरित करें UIBarButtonSystemItemCancelऔर यह सुनिश्चित करें कि आप अपने पाठ क्षेत्र में मूल मूल्य को नहीं छोड़ रहे हैं। लुडा के उत्तर में लागू "रद्द" व्यवहार, जो एक रिक्त स्ट्रिंग के साथ मूल्य को ओवरराइट करता है, वह नहीं हो सकता है जो आप चाहते हैं।

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

सहायक विचारों के निर्माण के बारे में अधिक जानकारी के लिए, डेटा इनपुट के लिए कस्टम दृश्यों पर Apple दस्तावेज़ देखें । आप शायद UIToolbar और UIBarButtonItem पर संदर्भ पृष्ठों से भी परामर्श करना चाहेंगे ।


[UIScreen mainScreen].applicationFrameiOS 9 में इस्तेमाल किया गया है। उपयोग करें[UIScreen mainScreen].bounds
उपयोगकर्ता -44651

11

UIKeyboardTypeNumberPad और अनुपलब्ध रिटर्न कुंजी का समाधान शानदार काम करता है, लेकिन केवल अगर स्क्रीन पर कोई अन्य गैर-संख्या पैड पाठ फ़ील्ड नहीं हैं।

मैंने उस कोड को लिया और इसे UIViewController में बदल दिया कि आप बस नंबर के काम करने के लिए सबक्लास कर सकते हैं। आपको उपरोक्त लिंक से आइकन प्राप्त करने की आवश्यकता होगी।

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

और नंबरपैड व्यू कंट्रोलर दोपहर:

#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

का आनंद लें।


6

यहाँ सबसे हाल का कोड है। सीधे शब्दों में #import "UIViewController + NumPadReturn.h" को अपने व्यू कंट्रोलर में शामिल करें।

यहाँ .h है

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

@interface UIViewController (NumPadReturn)



@end

और उन्हें

#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

यह सिम्युलेटर पर काम करने के लिए लगता है, लेकिन डिवाइस पर ... न तो मुझे DONE बटन दिखाई दे सकता है और न ही कुछ होता है जब मैं खाली जगह पर टैप करता हूं ... कोई विचार?
xoail

14
वाह, कृपया इस कोड का उपयोग न करें। आप एक वर्ग के भीतर से वर्ग विधियों को ओवरराइड करते हैं, जो आपके UIViewController वर्ग से "वास्तविक" व्यूडीडलॉड आदि को नजरअंदाज करने वाला है।
टोनी अर्नाल्ड

6

बहुत आसान उपाय

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

    [textViewInstance1 resignFirstResponder];
    [textViewInstance2 resignFirstResponder];
    [textField resignFirstResponder];
}

5

यदि आपके पास कई संख्यात्मक क्षेत्र हैं, तो मैं सुझाव देता हूं कि एक न्यूमेरिकटेक्फ़िल्ड बनाने के लिए UITextField को उपवर्गित करें जो हमेशा एक किए गए बटन के साथ एक संख्यात्मक कीबोर्ड प्रदर्शित करता है। फिर, बस अपने संख्यात्मक क्षेत्रों को इंटरफ़ेस बिल्डर में इस वर्ग के साथ जोड़ें और आपको अपने किसी भी व्यू कंट्रोलर में किसी भी अतिरिक्त कोड की आवश्यकता नहीं होगी। निम्नलिखित स्विफ्ट 3.0 वर्ग है जो मैं 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()
    }
}

स्विफ्ट 4.2

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: UIBarButtonItem.SystemItem.flexibleSpace, target: nil, action: nil)
        let callback = #selector(NumericTextField.finishedEditing)
        let donebutton = UIBarButtonItem(barButtonSystemItem: UIBarButtonItem.SystemItem.done, target: self, action: callback)
        numericKbdToolbar.setItems([space, donebutton], animated: false)
        numericKbdToolbar.sizeToFit()
        self.inputAccessoryView = numericKbdToolbar
    }

    // MARK: On Finished Editing Function
    @objc func finishedEditing()
    {
        self.resignFirstResponder()
    }
}

मैं आपके उप-वर्ग समाधान को पसंद करता हूं।
अचलोइलू

5

मैंने पाया @ user1258240 का जवाब बहुत संक्षिप्त है, क्योंकि यह एक returnKeyTypeसंपत्ति सेट करने के रूप में सरल नहीं है ।

बस अपना "पुन: प्रयोज्य" दृष्टिकोण इस में योगदान करना चाहता था:

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

    doneToolbar.items=[
        UIBarButtonItem(barButtonSystemItem: UIBarButtonItem.SystemItem.flexibleSpace, target: self, action: nil),
        UIBarButtonItem(title: "Done", style: UIBarButtonItem.Style.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)
}

3

स्विफ्ट 3.0 कुछ पिछले उत्तरों के कुछ हिस्सों का उपयोग करके एक अलग स्वाद।

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()
}

2

मैं यहां iOS 4.2+ के लिए एक समाधान का वर्णन करता हूं लेकिन कीबोर्ड दिखाई देने के बाद खारिज बटन फीका पड़ जाता है। यह भयानक नहीं है, लेकिन आदर्श भी नहीं है।

ऊपर दिए गए प्रश्न में वर्णित समाधान में बटन को खारिज करने के लिए एक अधिक सुरुचिपूर्ण भ्रम शामिल है, जहां मैं फीका और लंबवत रूप से बटन को विस्थापित करता हूं कि कीपैड और बटन एक साथ खारिज कर रहे हैं।


2

सबसे सरल तरीका है: कस्टम पारदर्शी बटन

बनाएं और इसे बाएं कोने में रखें, जिसमें खाली जगह होगी । टेक्स्ट बटन पर इस बटन को क्रमशः टॉगल करें (दिखाएँ / छिपाएँ) , बटन पर क्रमशः क्लिक करें।CGSizeUIKeyboardTypeNumberPadbecomeFirstResponder


2

यहाँ पर सबसे सरल उपाय है। मैंने इसे बिगिनिंग iOS 5 डेवलपमेंट बुक से सीखा है।

संख्या क्षेत्र मान लिया जाता है numberField

  1. में ViewController, निम्न विधि जोड़ें:

    -(IBAction)closeKeyboard:(id)sender;
  2. में ViewController.m, निम्न कोड जोड़ें:

    -(IBAction)closeKeyboard:(id)sender
    {
    
         [numberField resignFirstResponder];
    
    }
  3. nibफाइल पर वापस जाएं ।

  4. Utilitiesपैन खोलें ।
  5. पैन के Identity inspectorनीचे खोलें Utilities
  6. Viewएक बार (nib फ़ाइल में) पर क्लिक करें । सुनिश्चित करें कि आपने दृश्य में किसी भी आइटम पर क्लिक नहीं किया है। स्पष्टीकरण के लिए, आप UIView के तहत देखना चाहिए ClassमेंIdentity inspector
  7. UIView से UIControl तक क्लास बदलें।
  8. खोलें Connection Inspector
  9. आइकन Touch Downपर तीर को क्लिक करें और खींचें File Owner। (FYI करें ... फाइल ओनर आइकन बाईं ओर प्रदर्शित Viewहोता है और पीले फ्रेम के साथ एक खोखले क्यूब के रूप में दिखाई देता है।)
  10. विधि का चयन करें closeKeyboard:।
  11. प्रोग्राम चलाएं।

अब जब आप कहीं भी पृष्ठभूमि पर क्लिक करते हैं View, तो आपको कीबोर्ड को खारिज करने में सक्षम होना चाहिए।

आशा है कि यह आपकी समस्या को हल करने में आपकी सहायता करेगा। :-)


2

मैंने ब्रायन के समाधान को थोड़ा और अधिक मजबूत करने के लिए संशोधित किया, ताकि यह अन्य प्रकार के कीबोर्ड के साथ अच्छी तरह से खेल सके जो एक ही दृश्य में दिखाई दे। यह यहाँ वर्णित है:

IOS के numpad UIKeyboard पर एक DONE बटन बनाएं

मैं इसे यहाँ समझाने की कोशिश करूँगा, लेकिन यह देखने के लिए अधिकांश कोड है जो आसानी से यहाँ फिट नहीं होंगे


यह सबसे अच्छा समाधान था जो मुझे XCode 4.5 के लिए मिला था और यह iOS 6.0 के साथ काम करता है। यह संख्यात्मक कीबोर्ड के लिए एक Done बटन जोड़ता है। DONE बटन ग्राफिक्स प्राप्त करने के लिए मूल पोस्ट पर जाएं। neoos.ch/blog/...
बर्डमैन

2

यदि आप पहले से दर्ज किए जाने वाले अंकों की संख्या जानते हैं (उदाहरण के लिए 4-अंकों का पिन) तो आप इस तरह के प्रश्न के उत्तर के अनुसार 4 प्रमुख प्रेस के बाद ऑटो-खारिज कर सकते हैं:

नंबर पैड को खारिज करना

इस मामले में अतिरिक्त किए गए बटन की आवश्यकता नहीं है।


2

हम "उपयोगकर्ता कहीं और छुआ हुआ" समाधान को और भी सरल बना सकते हैं यदि हम संपादन को समाप्त करने के लिए अपने दृश्य नियंत्रक के दृष्टिकोण को बताएं:

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

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

... यह मानते हुए कि "कहीं और स्पर्श करना कीबोर्ड को खारिज करता है" दृश्य के साथ-साथ किसी भी अन्य संपादन योग्य क्षेत्रों के लिए वांछित व्यवहार है।


1

स्विफ्ट 2.2 के लिए मैं इसका इस्तेमाल करता हूं

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()
}

0

कीबोर्ड दृश्य को खोजने और तीसरी पंक्ति में किए गए बटन को जोड़ने के बारे में उन सभी कार्यान्वयन (यही कारण है कि बटन .y = 163 b / c कीबोर्ड की ऊंचाई 216 है) नाजुक हैं क्योंकि iOS दृश्य पदानुक्रम को बदलता रहता है। उदाहरण के लिए उपरोक्त में से कोई भी कोड iOS9 के लिए काम नहीं करता है।

मुझे लगता है कि यह [[[UIApplication साझाApplication] विंडोज़] lastObject] द्वारा केवल सबसे ऊपरी दृश्य को खोजने के लिए अधिक सुरक्षित है, और बस इसके निचले बाएं कोने में बटन जोड़ें, किया गया ब्यूटन.फ़्रेम = CectectMake (0, SCREEN_HEIGHT-53, 106 ; 53); // पोर्ट्रेट मोड


0

स्विफ्ट 2.2 / मैंने Dx_ के उत्तर का उपयोग किया। हालाँकि, मैं सभी कीबोर्ड पर यह कार्यक्षमता चाहता था। इसलिए मेरे आधार वर्ग में मैंने कोड डाला:

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)
        }
    }
}

फिर बस सभी कीबोर्ड में Done बटन जोड़ने के लिए viewDidLoad (या एक तालिका दृश्य का उपयोग करके willDisplayCell) में self.view.subviews पर addDoneButtonForTextFields को कॉल करें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.