IOS में numpad कीबोर्ड के लिए 'Done' बटन कैसे जोड़ें


84

इसलिए, संख्यात्मक कीबोर्ड डिफ़ॉल्ट रूप से 'पूर्ण' या 'अगला' बटन के साथ नहीं आता है, इसलिए मैं एक जोड़ना चाहूंगा। आईओएस 6 में और नीचे कीबोर्ड पर एक बटन जोड़ने के लिए कुछ तरकीबें थीं लेकिन वे आईओएस 7 में काम नहीं कर रहे हैं।

सबसे पहले मैं सूचना दिखाने वाले कीबोर्ड की सदस्यता लेता हूं

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

जब कीबोर्ड दिखाता है तो मैं एक बटन जोड़ने की कोशिश करता हूं:

- (void)keyboardWillShow:(NSNotification *)note 
{
    // create custom button
    UIButton *doneButton = [UIButton buttonWithType:UIButtonTypeSystem];
    doneButton.frame = CGRectMake(0, 50, 106, 53);
    doneButton.adjustsImageWhenHighlighted = NO;
    [doneButton setTitle:@"Done" forState:UIControlStateNormal];
    [doneButton addTarget:self action:@selector(dismissKeyboard) 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];
    }
}

लेकिन लूप के लिए नहीं चलता है क्योंकि यह किसी भी साक्षात्कार नहीं मिलता है। कोई सुझाव? मुझे iOS7 के लिए कोई समाधान नहीं मिला इसलिए ऐसा करने का एक अलग तरीका है?

संपादित करें: टूलबार लोगों के लिए सभी सुझावों के लिए धन्यवाद, लेकिन मैं उस मार्ग से नीचे नहीं जाऊंगा क्योंकि मैं काफी अंतरिक्ष खराब हूं (और यह बदसूरत है)।


इस पोस्ट की कोशिश की? neoos.ch/blog/…
अनिल

@ अनिल UIKeyboard को अनुकूलित करने का यह तरीका सेब द्वारा निषिद्ध है।
12hargavḯ

UIKeyboardDidShowNotification के साथ जांचें।
प्रवीण मतानम


2
मैं वास्तव में एक टूलबार नहीं जोड़ना चाहता, मैं कीबोर्ड पर बटन को सही रखना चाहता हूं।
जॉर्ज मैककिबिन

जवाबों:


26

यह iOS7 संख्या-कीपैड में किए गए बटन को प्रोजेक्ट करने का एक सरल तरीका है। UITextField के नीचे प्रतिनिधि विधि में, कीबोर्ड शो के लिए एक अधिसूचना जोड़ें।

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

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

अब keyboardWillShowनीचे दिए गए तरीके को लागू करें। यहां हमें iOS7 के लिए अतिरिक्त देखभाल करने की आवश्यकता है।

- (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:@"doneButtonNormal.png"] forState:UIControlStateNormal];
[doneButton setImage:[UIImage imageNamed:@"doneButtonPressed.png"] forState:UIControlStateHighlighted];
[doneButton addTarget:self action:@selector(doneButton:) forControlEvents:UIControlEventTouchUpInside];

if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")) {
    dispatch_async(dispatch_get_main_queue(), ^{
        UIView *keyboardView = [[[[[UIApplication sharedApplication] windows] lastObject] subviews] firstObject];
        [doneButton setFrame:CGRectMake(0, keyboardView.frame.size.height - 53, 106, 53)];
        [keyboardView addSubview:doneButton];
        [keyboardView bringSubviewToFront:doneButton];

        [UIView animateWithDuration:[[note.userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] floatValue]-.02
                              delay:.0
                            options:[[note.userInfo objectForKey:UIKeyboardAnimationCurveUserInfoKey] intValue]
                         animations:^{
                             self.view.frame = CGRectOffset(self.view.frame, 0, 0);
                         } completion:nil];
    });
}else {
    // locate keyboard view
    dispatch_async(dispatch_get_main_queue(), ^{
        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];
        }
    });
  }
}

अब SYSTEM_VERSION का पता लगाने के लिए इस मैक्रो को उपयुक्त हेडर में जोड़ें

#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)


1
धन्यवाद, यह वही है जो मैं चाहता था :) दुर्भाग्य से अगर स्क्रीन पर पहले से ही एक कीबोर्ड था और फिर आप एक फ़ील्ड पर स्विच करते हैं, जिसे एक कीपैड कीबोर्ड की आवश्यकता होती है, तो keyBoardWillShow को कॉल नहीं किया जाता है। लेकिन धन्यवाद, सही दिशा में एक कदम है हाहा।
जॉर्ज मैककिबिन

SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO NSFoundationVersionNumber> NSFoundationVersionNumber_iOS_6_0 क्यों नहीं? और मैं यह परीक्षण, NSFoundationVersionNumber_iOS_5_0 बेहतर है
govo

dispatch_async यहां कीबोर्ड में हैक करने का सबसे विश्वसनीय तरीका नहीं है। :(
प्रोनबर्ड

7
iOS8 में यह किया गया बटन छिपा नहीं है, कीबोर्ड की बर्खास्तगी के बाद।
हेमंत चित्तौड़

2
यह जवाब, हालांकि, चतुर, तोड़ने के लिए बाध्य था।
स्विफ्टआर्किटेक्ट

187

बटन के UIToolBarसाथ एक अधिक सुरक्षित दृष्टिकोण का उपयोग करना है ।DoneinputAccessoryView


नमूना कोड :

UIToolbar *keyboardDoneButtonView = [[UIToolbar alloc] init];
[keyboardDoneButtonView sizeToFit];
UIBarButtonItem *doneButton = [[UIBarButtonItem alloc] initWithTitle:@"Done"
                                                               style:UIBarButtonItemStyleBordered target:self
                                                              action:@selector(doneClicked:)];
[keyboardDoneButtonView setItems:[NSArray arrayWithObjects:doneButton, nil]];
txtField.inputAccessoryView = keyboardDoneButtonView;

आपकी -doneClickedविधि इस तरह दिखनी चाहिए:

- (IBAction)doneClicked:(id)sender
{
    NSLog(@"Done Clicked.");
    [self.view endEditing:YES];
}

नमूना कोड स्विफ्ट:

let keyboardDoneButtonView = UIToolbar.init()
keyboardDoneButtonView.sizeToFit()
let doneButton = UIBarButtonItem.init(barButtonSystemItem: UIBarButtonSystemItem.Done, 
                                                   target: self, 
                                                   action: Selector("doneClicked:")))    

keyboardDoneButtonView.items = [doneButton]
textFieldInput.inputAccessoryView = keyboardDoneButtonView

आपकी -doneClickedविधि इस तरह दिखनी चाहिए:

func doneClicked(sender: AnyObject) {
  self.view.endEditing(true)
}

मुझे ऐसा करने का अंत करना पड़ सकता है। मुझे वास्तव में पसंद नहीं है कि यह कितना स्थान लेता है।
जॉर्ज मैककिबिन

3
@GeorgeMcKibbin: अंतरिक्ष यहाँ मुद्दा नहीं होना चाहिए क्योंकि यह उस स्थान को केवल तब लेगा जब आप टाइप कर रहे हों। मेरे अनुसार, यह दृष्टिकोण कीबोर्ड के साथ खिलवाड़ करने से कहीं बेहतर है जो आमतौर पर Apple को पसंद नहीं है।
भाविन

जब मैं ऐसा करता हूं, तो मुझे केवल मेरी स्क्रीन के नीचे टूलबार मिलता है और कीबोर्ड दिखाई नहीं देता है। विचार?
क्रिस

महान जवाब, सिर्फ एक tidbit, arrayWithObjects, शाब्दिक के पक्ष में अनिर्दिष्ट है: [NSArray arrayWithObjects: didButton, nil] => @ @'Button]
Austin

1
iOS 8.0 UIBarButtonItemStyleBorderedसे पदावनत उपयोग UIBarButtonItemStyleDoneयाUIBarButtonItemStylePlain
नज़ीर

130

और भी आसान तरीका:

स्विफ्ट 3.0 और उससे अधिक :

func addDoneButton() {
    let keyboardToolbar = UIToolbar()
    keyboardToolbar.sizeToFit()
    let flexBarButton = UIBarButtonItem(barButtonSystemItem: .flexibleSpace,
        target: nil, action: nil)
    let doneBarButton = UIBarButtonItem(barButtonSystemItem: .done,
        target: view, action: #selector(UIView.endEditing(_:)))
    keyboardToolbar.items = [flexBarButton, doneBarButton]
    textField.inputAccessoryView = keyboardToolbar
}

2.3 और नीचे स्विफ्ट :

func addDoneButton() {
    let keyboardToolbar = UIToolbar()
    keyboardToolbar.sizeToFit()
    let flexBarButton = UIBarButtonItem(barButtonSystemItem: .FlexibleSpace,
        target: nil, action: nil)
    let doneBarButton = UIBarButtonItem(barButtonSystemItem: .Done,
        target: view, action: #selector(UIView.endEditing(_:)))
    keyboardToolbar.items = [flexBarButton, doneBarButton]
    textField.inputAccessoryView = keyboardToolbar
}

उद्देश्य सी :

- (void)addDoneButton {
    UIToolbar* keyboardToolbar = [[UIToolbar alloc] init];
    [keyboardToolbar sizeToFit];
    UIBarButtonItem *flexBarButton = [[UIBarButtonItem alloc]
    initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace
    target:nil action:nil];
    UIBarButtonItem *doneBarButton = [[UIBarButtonItem alloc]
    initWithBarButtonSystemItem:UIBarButtonSystemItemDone
    target:self.view action:@selector(endEditing:)];
    keyboardToolbar.items = @[flexBarButton, doneBarButton];
    self.textField.inputAccessoryView = keyboardToolbar;
}

संपादित करें:

मैंने DCKit नामक एक उपयोगी लाइब्रेरी बनाई है , जिसमें पहले से ही टूलबार बॉक्स से बाहर है:

IOS में कीबोर्ड के ऊपर टूलबार (DCKit लाइब्रेरी का उपयोग करके)

इसमें कई अन्य शांत विशेषताएं भी हैं।


1
ऐसा लगता है कि आपने 1 साल पहले से एक नए उत्तर के रूप में भाविन के उत्तर में एक फ्लेक्स बार बटन जोड़ा था ताकि मैं देख सकूं कि किसी ने इसे वोट क्यों दिया। शायद मैं यहाँ भी कुछ याद किया?
मार्क मैककॉरले

2
हां, मैं उपयोग नहीं करता initWithTitle:@"Done", मैं initWithBarButtonSystemItem:UIBarButtonSystemItemDoneइसके बजाय उपयोग करता हूं । यह मानक एप्पल के डन बार बटन को वापस कर देगा। इसके अलावा, यह पहले से ही स्थानीय हो जाएगा
एंड्री गोर्डीव

3
इसे पहले के सही उत्तर IMO में सुधार (टिप्पणी) के रूप में जोड़ा जाना चाहिए या वोटों की अपेक्षा की जानी चाहिए। एक नए उत्तर में मूल प्रश्न के लिए एक अलग दृष्टिकोण शामिल होना चाहिए, न कि किसी मौजूदा प्रश्न में सुधार। बहरहाल, सुधार के लिए धन्यवाद। ;-)
मार्क मैककॉर्ल

4
नहीं, मुझे ऐसा नहीं लगता। टिप्पणियाँ कोड लिखने के लिए उपयोग नहीं की जानी चाहिए :)
एंड्री गोर्डीव

13

बस स्विफ्ट संस्करण के साथ ऊपर के उत्तर पर निर्माण करना क्योंकि मुझे इसका अनुवाद करना था:

   @IBOutlet weak var numberTextField: UITextField!

    override func viewDidLoad() {
        addDoneButtonTo(numberTextField)
    }

    // MARK: Done for numberTextField

    private func addDoneButtonTo(textField: UITextField) {
        let flexBarButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.FlexibleSpace, target: nil, action: nil)
        let doneBarButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.Done, target: self, action: "didTapDone:")
        let keyboardToolbar = UIToolbar()
        keyboardToolbar.sizeToFit()
        keyboardToolbar.items = [flexBarButton, doneBarButton]
        textField.inputAccessoryView = keyboardToolbar
    }

    func didTapDone(sender: AnyObject?) {
        numberTextField.endEditing(true)
    }

3

आप उपयोग कर सकते हैं

myTextField.inputAccessoryView = _inputView;

इनपुट एक्सेसरी व्यू एक ऐसा दृश्य है जो कीबोर्ड पर हमेशा आता है और इसके साथ खारिज हो जाता है [textfield resignFirstResponder]

डाल doneइनपुट दृश्य पर और textfields के resignfirst प्रत्युत्तर प्रदर्शन करते हैं।


2

महज प्रयोग करें

yourTextField.inputAccessoryView

आशा है कि आप मदद करेंगे


2
enter code here

1. register the controller to the notification

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    // Keyboard events
    [[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(keyboardWillShow:)
                                             name:UIKeyboardWillShowNotification
                                           object:nil];

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

2. don't forget to remove the controller from the notification centre

-(void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];
    [self.view endEditing:YES];
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

3. implement keyboard notification handlers

- (void)keyboardWillShow:(NSNotification *)notification {

// create custom button
    UIButton *doneButton = [UIButton buttonWithType:UIButtonTypeCustom];
    doneButton.frame = CGRectMake(0, 107, 106, 53);
    [doneButton setTitle:@"Done" forState:UIControlStateNormal];
    [doneButton addTarget:self  action:@selector(doneButton:)forControlEvents:UIControlEventTouchUpInside];

// save the reference to the button in order to use it in keyboardWillHide method
   self.donekeyBoardBtn = doneButton;

// to my mind no need to search for subviews
   UIWindow *windowContainigKeyboard = [[[UIApplication sharedApplication] windows]  lastObject];
   [windowContainigKeyboard addSubview:self.donekeyBoardBtn];
   self.donekeyBoardBtn.frame = CGRectMake(0., CGRectGetHeight(w.frame) -  CGRectGetHeight(self.donekeyBoardBtn.frame), CGRectGetWidth(self.donekeyBoardBtn.frame), CGRectGetHeight(self.donekeyBoardBtn.frame));
}

- (void)keyboardWillHide:(NSNotification *)notification {

    [self.donekeyBoardBtn removeFromSuperview];
}

4. implement done button action

- (void)doneButton:(id)sender{
   // add needed implementation
      [self.view endEditing:YES]; 
}

मैंने आपके उत्तर को उसी तरह लागू किया जो मुझे करना है। धन्यवाद। लेकिन बटन एक एनिमेटेड ऑब्जेक्ट के रूप में नहीं आता है, जब कीबोर्ड शो होता है।
अर्पित बी पारेख

1

आपको यह पता लगाने की आवश्यकता है कि क्या आप iPad या फोन पर हैं क्योंकि iPad "नंबर" पैड पर रिटर्न कुंजी लागू करता है


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