İPhone sayı defterinde “Bitti” düğmesi nasıl gösterilir


237

Sayısal tuş takımında "Bitti" düğmesi yoktur. Bir kullanıcı bir metin alanına sayısal bilgi girmeyi tamamladığında, sayısal tuş takımının nasıl kaybolmasını sağlayabilirim?

Varsayılan klavyeyi kullanarak bir "Bitti" düğmesi alabilirim, ancak kullanıcıların sayı girmek için sayısal tuşlara geçmesi gerekir. Sayısal tuş takımında "Bitti" düğmesini göstermenin bir yolu var mı?

Yanıtlar:


339

Başka bir çözüm. Ekranda başka sayısal olmayan tuş takımı metin alanları varsa mükemmeldir.

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
Şüphesiz bunu başarmanın en iyi yolu. Açıkça Apples sıkı HIG bağlı olduğu için.
Hubert Kunnemeyer

3
Diğer çözüm, ekran klavyesinde herhangi bir grafik değişikliği açısından kırılmaya karşı çok kırılgandır.
Kailoon

Birden çok metin alanı varsa, hangi UITextField öğesinin düzenlenmekte olduğunu nasıl belirlerim?
Nate

.H içindeki UITextField öğenizi örnek değişkeni olarak tanımlayın.
Luda

3
@BenPotter Metnin çubuk rengi ve renk tonu için barTint'i ayarlarsınız. Ayrıca, intializer'ın dışında UIBarButton öğelerini oluşturabilir ve bunların rengini açık bir şekilde ayarlayabilirsiniz.
14'te

50

Luda'nın Swift'e cevabı için bir uyarlama:

UIViewController alt sınıfınızın beyanında

let numberToolbar: UIToolbar = UIToolbar()

ViewDidLoad ifadesinde:

    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 

ve hoopla ve hoopla işlevlerini ekleyin (diğer adları seçmekten çekinmeyin, sadece ViewDidLoad'daki seçici adlarını değiştirin

func boopla () {
    textField.resignFirstResponder()
}

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

1
UIBarButtonItemStyle.BorderediOS 8.0'dan beri kullanımdan kaldırıldı. UIBarButtonItemStyle.Plainyerine önerilir.
Jonny

Seçiciler şu şekilde güncellenmelidir: #selector (YourViewController.boopla)
David V

Jonny ve David muhtemelen haklı. Artık iOS için programlamıyorum, bu yüzden değişiklikleri takip etmiyorum. Birisi güncellenmiş bir çözüm gönderirse, bir düzenlemede buna değineceğim.
user1258240

14

Gördüğüm hile, tüm görünümün boyutunda özel bir şeffaf düğme yapmak ve ardından tıklama yönteminde metin alanının ilk yanıtlayıcıyı istifa etmesini sağlamak. Böylece kullanıcı tuş takımını kapatmak için alanın dışındaki herhangi bir yeri tıklatabilir.


3
Bunu Return tuşuna ek olarak yaptım. Çok daha kullanıcı dostu bir uygulama sağlar. Hem dönüş anahtarları hem de herhangi bir yere tıklayın dönüş yöntemlerini vermek istiyorum.
IcyBlueRose

4
şimdi UIGestureRecognizers var, sadece ana görünüm denetleyicisi görünümünde bir musluk hareketi tanıyıcı kurmak ve onun endEditing: YES onun görünümüne göndermek var. Bu, klavyenin dışına dokunduğunuzda klavyenin hizmet verebileceği her metin alanı için klavyeyi kapatır.
chadbag

14

Bir Swift 3 bir uzantı ile çözelti. UITextFieldUygulamanızda birkaç sayısal nesneniz varsa idealdir , çünkü her biri için Bitti veya İptalUITextField düğmesine dokunulduğunda özel bir eylem gerçekleştirmeye karar verme esnekliği sağlar .

resim açıklamasını buraya girin

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

Varsayılan eylemleri kullanarak kullanım örneği:

//
// MyViewController.swift
//

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

Özel bir Bitti eylemi kullanan kullanım örneği :

//
// MyViewController.swift
//

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

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

12

Aşağıda Luda'nın cevabını aşağıdaki değişikliklerle gözden geçiriyoruz:

  • aksesuar görünümü otomatik olarak uygulama çerçevesinin genişliğine göre boyutlandırılır

  • kullanımdan kaldırılmış sabitten UIBarButtonItemStyleBorderedkaçınılır

  • "Bitti" düğmesi, UIBarButtonSystemItemDone

Şu anda "Bitti" düğmesi aksesuar görünümünde ortalanmıştır. İlgili taraftaki alanı silerek sola veya sağa konumlandırabilirsiniz.

Varsayılan klavyede de bir tane olmadığı için "İptal" düğmesini atladım. "İptal" düğmesini kullanmak istiyorsanız, düğmeyi a olarak başlatmanızı UIBarButtonSystemItemCancelve metin alanınızdaki orijinal değeri atmadığınızdan emin olmanızı öneririm . Boş bir dize ile değerin üzerine yazan Luda'nın yanıtında uygulanan "İptal" davranışı, istediğiniz gibi olmayabilir.

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

Aksesuar görünümleri oluşturma hakkında daha fazla bilgi için, veri girişi özel görünümleriyle ilgili Apple belgelerine bakın . Muhtemelen UIToolbar ve UIBarButtonItem referans sayfalarına da bakmak isteyeceksiniz .


[UIScreen mainScreen].applicationFrameiOS 9'da kullanımdan kaldırıldı. Kullanım[UIScreen mainScreen].bounds
kullanıcı-44651

11

UIKeyboardTypeNumberPad ve kayıp dönüş tuşundaki çözüm, ancak ekranda başka bir sayı olmayan ped metin alanı yoksa harika çalışıyor.

Bu kodu aldım ve sayı pedlerinin çalışmasını sağlamak için sadece alt sınıfa girebileceğiniz bir UIViewController'a çevirdim. Yukarıdaki bağlantıdan simgeleri almanız gerekir.

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

ve 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

Zevk almak.


6

İşte en son kod. Görünümünüzde #import "UIViewController + NumPadReturn.h" ifadesini eklemeniz yeterlidir.

İşte .h

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

@interface UIViewController (NumPadReturn)



@end

Ve onları

#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

bu simülatörde çalışıyor gibi görünüyor ama cihazda ... ne yaptım DONE düğmesini ne de boş alana dokunduğumda hiçbir şey olmuyor ... herhangi bir fikir?
xoail

14
Vay be, lütfen bu kodu kullanmayın. UIViewController sınıfınızdan "real" viewDidLoad, vb. Yok sayılmasına neden olacak bir kategorideki sınıf yöntemlerini geçersiz kıldınız.
Tony Arnold

6

Çok daha kolay bir çözüm

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

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

5

Birden fazla sayısal alanınız varsa, her zaman tamamlanmış bir düğmeyle sayısal bir klavye görüntüleyen bir NumericTextField oluşturmak için UITextField öğesinin alt sınıflandırılmasını öneririm. Ardından, Arayüz Oluşturucu'da sayısal alanlarınızı bu sınıfla ilişkilendirdiğinizde, Görünüm Denetleyicilerinizden herhangi bir ek koda ihtiyacınız olmayacaktır. Aşağıdaki Xcode 8.0 kullandığım Swift 3.0 sınıfı.

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

Hızlı 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()
    }
}

Alt sınıf çözümünüzü tercih ederim.
AechoLiu

5

@ User1258240'ın cevabının , bu ayarı yapmak kadar basit olmadığı göz önüne alındığında oldukça özlü buldumreturnKeyType özelliği .

Sadece kendi "yeniden kullanılabilir" yaklaşımımı buna katkıda bulunmak istedim:

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

SWIFT 3.0 Önceki bazı cevapların bölümlerini kullanan farklı bir lezzet.

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

Burada iOS 4.2+ için bir çözüm açıklıyorum ancak klavye göründükten sonra kapat düğmesi kayboluyor. Korkunç değil, ideal de değil.

Yukarıda bağlantılı soruda açıklanan çözüm, düğmeyi kapatmak için daha zarif bir yanılsama içerir, burada solup, tuş takımının ve düğmenin birlikte bıraktığı görünümü sağlamak için düğmeyi dikey olarak değiştiririm.


2

En basit yol: Özel şeffaf düğme

oluşturun ve sol boş köşeye yerleştirin, bu da boş alanla aynı olacaktır . Sırasıyla düğme tıklatmayla textField üzerinde bu düğmeyi aç / kapat (göster) .CGSizeUIKeyboardTypeNumberPadbecomeFirstResponder


2

İşte karşılaştığım en basit çözüm. Bunu Başlangıç ​​iOS 5 Geliştirme kitabından öğrendim.

Sayı alanının çağrıldığı varsayılarak numberField.

  1. Alanına ViewControlleraşağıdaki yöntemi ekleyin:

    -(IBAction)closeKeyboard:(id)sender;
  2. Alanına ViewController.maşağıdaki kodu ekleyin:

    -(IBAction)closeKeyboard:(id)sender
    {
    
         [numberField resignFirstResponder];
    
    }
  3. nibDosyaya geri dön .

  4. UtilitiesTavayı açın .
  5. Identity inspectoraltında Utilitiestava.
  6. Tıklayın View(uç dosyasında) bir kez. Görünümdeki öğelerin hiçbirini tıklamadığınızdan emin olun. Açıklığa kavuşturmak için, altında UIView'i görmelisiniz Class.Identity inspector .
  7. Sınıfı UIView yerine UIControl olarak değiştirin.
  8. Connection Inspector.
  9. Simgenin Touch Downüzerindeki oku tıklayıp sürükleyip bırakın File Owner. (Bilginize ... Dosya Sahibi simgesi solda Viewgörüntülenir ve sarı çerçeveli içi boş bir küp olarak görünür.)
  10. Yöntemini seçin: closeKeyboard.
  11. Programı çalıştır.

Şimdi arka planda herhangi bir yeri tıkladığınızda View klavyeyi kapatabilirsiniz.

Umarım bu sorununuzu çözmenize yardımcı olur. :-)


2

Bryan'ın çözümünü biraz daha sağlam olacak şekilde değiştirdim, böylece aynı görünümde görünebilecek diğer klavye türleriyle güzelce oynayacaktı. Burada açıklanmıştır:

İOS sayısal tuş takımı UIK panosunda YAPILDI düğmesi oluşturma

Ben burada açıklamaya çalışacağım, ama çoğu kolayca burada uygun olmaz bakmak için kod


Bu, XCode 4.5 için bulduğum en iyi çözümdü ve iOS 6.0 ile çalışıyor. Sayısal klavyeye bir DONE düğmesi ekler. YAPILDI düğmesi grafiklerini almak için orijinal yayına gidin. neoos.ch/blog/…
birdman

2

Önceden girilecek sayıların sayısını (ör. 4 haneli bir PIN) biliyorsanız, bu benzer soruya verdiğim cevaba göre 4 tuşa basıldıktan sonra otomatik olarak kapatabilirsiniz:

Sayısız Pad

Bu durumda ek bir düğmeye gerek yoktur.


2

Ayrıca , görünüm denetleyicimizin görüşünün düzenlemeyi sona erdirmesini söylersek "başka bir yere dokunan kullanıcı" çözümünü daha da basitleştirebiliriz:

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

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

... "başka bir yere dokunmanın klavyeyi kapatması" nın, görünümdeki diğer düzenlenebilir alanlar için de istenen davranış olduğunu varsayarsak.


1

Swift 2.2 için bunu kullanıyorum

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

Klavye görünümünü bulma ve bitmiş düğmeyi 3. satıra ekleme ile ilgili tüm uygulamalar (bu yüzden button.y = 163 b / c klavyenin yüksekliği 216'dır) çünkü iOS görünüm hiyerarşisini değiştirmeye devam ediyor. Örneğin, yukarıdaki kodların hiçbiri iOS9 için çalışmaz.

Sadece [[[UIApplication sharedApplication] windows] lastObject] ile en üstteki görünümü bulmanın ve düğmeyi sol alt köşesine eklemenin daha güvenli olduğunu düşünüyorum, doneButton.frame = CGRectMake (0, SCREEN_HEIGHT-53, 106 , 53); // portre modu


0

Swift 2.2 / Dx_'nin cevabını kullandım. Ancak, bu işlevi tüm klavyelerde istedim. Yani benim temel sınıfta kodu koymak:

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

Ardından, Bitmiş düğmesini tüm klavyelere eklemek için viewDidLoad'daki (veya tablo görünümü kullanılıyorsa willDisplayCell) self.view.subviews üzerinde addDoneButtonForTextFields öğesini çağırmanız yeterlidir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.