Cara menampilkan tombol "Selesai" pada papan nomor iPhone


237

Tidak ada tombol "Selesai" pada papan nomor. Ketika pengguna selesai memasukkan informasi numerik dalam bidang teks, bagaimana saya bisa membuat pad nomor menghilang?

Saya bisa mendapatkan tombol "Selesai" dengan menggunakan keyboard default, tetapi kemudian pengguna harus beralih ke tombol angka untuk memasukkan angka. Apakah ada cara untuk menunjukkan tombol "Selesai" pada papan nomor?

Jawaban:


339

Solusi lain. Sempurna jika ada bidang teks pad non-angka lainnya di layar.

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
Tidak diragukan lagi cara terbaik untuk mencapai ini. Secara eksplisit karena mematuhi Apel HIG yang ketat.
Hubert Kunnemeyer

3
Solusi lain sangat rapuh dalam hal perubahan grafis pada keyboard layar yang akan merusaknya.
kailoon

Jika ada beberapa bidang teks, bagaimana cara menentukan UITextField mana yang sedang diedit?
Nate

Tentukan UITextField Anda di .h sebagai variabel instan.
Luda

3
@BenPotter Anda akan mengatur barTint untuk warna bar dan warna untuk teks. Anda juga bisa membuat item UIBarButton di luar intializer dan mengatur warnanya secara eksplisit di sana.
ocross

50

Berikut ini adalah adaptasi untuk jawaban Luda untuk Swift:

Dalam deklarasi put subclass UIViewController Anda

let numberToolbar: UIToolbar = UIToolbar()

di ViewDidLoad put:

    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 

dan tambahkan fungsi hoopla dan hoopla (jangan ragu untuk memilih nama lain, cukup ubah nama pemilih di ViewDidLoad sesuai

func boopla () {
    textField.resignFirstResponder()
}

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

1
UIBarButtonItemStyle.Borderedsudah ditinggalkan sejak iOS 8.0. UIBarButtonItemStyle.Plaindisarankan sebagai gantinya.
Jonny

Selektor harus diperbarui ke: #selector (YourViewController.boopla)
David V

Jonny dan David mungkin benar. Saya tidak pemrograman untuk iOS lagi jadi saya tidak mengikuti perubahan. Jika ada yang memposting solusi yang diperbarui, saya akan merujuknya dalam edit.
user1258240

14

Trik yang pernah saya lihat digunakan adalah untuk membuat tombol transparan transparan ukuran seluruh tampilan dan kemudian dalam metode klik, memiliki bidang teks mengundurkan diri responden pertama. Jadi pengguna dapat mengklik di mana saja di luar lapangan untuk mengabaikan keypad.


3
Saya telah melakukan ini selain tombol Kembali. Itu membuat untuk aplikasi yang jauh lebih ramah pengguna. Saya suka memberikan kedua tombol kembali dan klik di mana saja kembali metode.
IcyBlueRose

4
sekarang kami memiliki UIGestureRecognizers, cukup atur pengukur gestur ketuk pada tampilan viewcontroller utama dan kirimkan endEditing: YES to view. Ini akan menutup keyboard untuk setiap bidang teks yang dapat diservis keyboard, saat menyentuh di luar keyboard.
chadbag

14

Solusi Swift 3 menggunakan ekstensi. Ideal jika Anda memiliki beberapa UITextFieldobjek numerik di aplikasi Anda karena memberikan fleksibilitas untuk memutuskan, untuk masing-masing UITextField, apakah akan melakukan tindakan kustom ketika Selesai atau Batal disadap.

masukkan deskripsi gambar di sini

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

Contoh penggunaan menggunakan tindakan default:

//
// MyViewController.swift
//

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

Contoh penggunaan menggunakan tindakan Selesai kustom :

//
// MyViewController.swift
//

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

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

12

Di bawah ini adalah perombakan jawaban Luda dengan perubahan berikut:

  • tampilan aksesori secara otomatis berukuran sesuai dengan lebar bingkai aplikasi

  • konstanta yang sudah usang UIBarButtonItemStyleBordereddihindari

  • tombol "Selesai" dipakai sebagai UIBarButtonSystemItemDone

Saat ini tombol "Selesai" berpusat di tampilan aksesori. Anda dapat memposisikannya di kiri atau kanan dengan menghapus spasi di sisi yang bersangkutan.

Saya telah menghilangkan tombol "Batal" karena keyboard default juga tidak memilikinya. Jika Anda menginginkan tombol "Batal", saya sarankan Anda membuat instantiate sebagai UIBarButtonSystemItemCanceldan Anda memastikan Anda tidak membuang nilai asli di bidang teks Anda. Perilaku "Batalkan" yang diterapkan dalam jawaban Luda, yang menimpa nilai dengan string kosong, mungkin bukan yang Anda inginkan.

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

Untuk informasi lebih lanjut tentang membangun tampilan aksesori, lihat dokumentasi Apple pada tampilan kustom untuk input data . Anda mungkin ingin melihat halaman referensi di UIToolbar dan UIBarButtonItem juga.


[UIScreen mainScreen].applicationFrametidak digunakan lagi di iOS 9. Gunakan[UIScreen mainScreen].bounds
user-44651

11

Solusi di UIKeyboardTypeNumberPad dan tombol kembali yang hilang berfungsi dengan baik tetapi hanya jika tidak ada bidang teks pad non-angka lainnya di layar.

Saya mengambil kode itu dan mengubahnya menjadi UIViewController yang dapat Anda gunakan untuk membuat subclass agar nomor berfungsi. Anda harus mendapatkan ikon dari tautan di atas.

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

dan 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

Nikmati.


6

Ini kode terbaru. Cukup sertakan #import "UIViewController + NumPadReturn.h" di viewController Anda.

Ini adalah .h

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

@interface UIViewController (NumPadReturn)



@end

Dan mereka

#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

ini tampaknya berfungsi pada simulator tetapi pada perangkat ... saya tidak dapat melihat tombol SELESAI maupun apa pun yang terjadi ketika saya mengetuk ruang kosong ... ada ide?
xoail

14
Wow, tolong jangan gunakan kode ini. Anda mengesampingkan metode kelas dari dalam suatu kategori, yang akan menyebabkan viewDidLoad "nyata", dll. Dari kelas UIViewController Anda diabaikan.
Tony Arnold

6

Solusi yang jauh lebih mudah

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

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

5

Jika Anda memiliki beberapa bidang numerik, saya sarankan subclassing UITextField untuk membuat NumericTextField yang selalu menampilkan keyboard numerik dengan tombol selesai. Kemudian, cukup kaitkan bidang numerik Anda dengan kelas ini di Interface Builder dan Anda tidak akan memerlukan kode tambahan di Pengontrol Tampilan apa pun. Berikut ini adalah kelas Swift 3.0 yang saya gunakan di 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()
    }
}

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

Saya lebih suka solusi sub-kelas Anda.
AechoLiu

5

Saya menemukan jawaban @ user1258240 cukup ringkas mengingat ini tidak sesederhana mengatur returnKeyTypeproperti.

Hanya ingin menyumbangkan pendekatan "dapat digunakan kembali" saya sendiri untuk ini:

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 Rasa yang berbeda, menggunakan bagian dari beberapa jawaban sebelumnya.

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

Saya menjelaskan satu solusi untuk iOS 4.2+ di sini, tetapi tombol pemberhentian memudar setelah keyboard muncul. Ini tidak buruk, tetapi juga tidak ideal.

Solusi yang dijelaskan dalam pertanyaan yang ditautkan di atas termasuk ilusi yang lebih elegan untuk menghilangkan tombol, di mana saya pudar dan secara vertikal memindahkan tombol untuk memberikan tampilan bahwa tombol dan tombol saling lepas.


2

Cara paling sederhana adalah:

Buat tombol transparan transparan dan letakkan di sudut kiri bawah, yang akan sama CGSizedengan ruang kosong di UIKeyboardTypeNumberPad. Beralih (tampilkan / sembunyikan) tombol ini di textField becomeFirstResponder, klik tombol masing-masing.


2

Inilah solusi paling sederhana yang saya temui. Saya telah mempelajari ini dari buku Pengembangan Beginning iOS 5.

Dengan asumsi bidang angka disebut numberField.

  1. Di ViewController, tambahkan metode berikut:

    -(IBAction)closeKeyboard:(id)sender;
  2. Di ViewController.m, tambahkan kode berikut:

    -(IBAction)closeKeyboard:(id)sender
    {
    
         [numberField resignFirstResponder];
    
    }
  3. Kembali ke nibfile.

  4. Buka Utilitiespanci
  5. Buka wajan Identity inspectorbawah Utilities.
  6. Klik pada View(dalam file nib) sekali. Pastikan Anda belum mengklik salah satu item dalam tampilan. Demi klarifikasi, Anda harus melihat UIView Classdi bawah Identity inspector.
  7. Ubah kelas dari UIView ke UIControl.
  8. Terbuka Connection Inspector.
  9. Klik dan seret Touch Downdan jatuhkan panah pada File Ownerikon. (FYI ... Ikon Pemilik File ditampilkan di sebelah kiri Viewdan muncul sebagai kubus berongga dengan bingkai kuning.)
  10. Pilih metode: closeKeyboard.
  11. Jalankan programnya.

Sekarang ketika Anda mengklik di mana saja pada latar belakang View, Anda harus dapat mengabaikan keyboard.

Semoga ini bisa membantu Anda memecahkan masalah Anda. :-)


2

Saya memodifikasi solusi Bryan menjadi sedikit lebih kuat, sehingga akan cocok dengan jenis keyboard lain yang bisa muncul dalam tampilan yang sama. Dijelaskan di sini:

Buat tombol DILAKUKAN pada papan tombol papan ketik iOS

Saya akan mencoba menjelaskannya di sini, tetapi sebagian besar adalah kode untuk dilihat yang tidak mudah masuk di sini


Ini adalah solusi terbaik yang saya temukan untuk XCode 4.5 dan berfungsi dengan iOS 6.0. Ini menambahkan tombol SELESAI ke keyboard numerik. Pergi ke posting asli untuk mendapatkan grafik tombol DILAKUKAN. neoos.ch/blog/…
birdman

2

Jika Anda tahu sebelumnya jumlah nomor yang harus dimasukkan (misalnya PIN 4 digit), Anda dapat memberhentikan otomatis setelah 4 tombol ditekan, sesuai jawaban saya untuk pertanyaan serupa:

menolak Number Pad

Tidak perlu tombol selesai dilakukan dalam kasus ini.


2

Kami juga dapat membuat solusi "pengguna menyentuh tempat lain" menjadi lebih mudah jika kami hanya memberi tahu pandangan pengontrol tampilan kami untuk mengakhiri pengeditan:

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

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

... dengan asumsi bahwa "menyentuh tempat lain mengabaikan keyboard" adalah perilaku yang diinginkan untuk bidang yang dapat diedit lainnya pada tampilan juga.


1

Untuk Swift 2.2 saya menggunakan ini

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

Semua implementasi tentang menemukan tampilan keyboard dan menambahkan tombol selesai di baris ke-3 (itulah sebabnya button.y = 163 b / c ketinggian keyboard adalah 216) rapuh karena iOS terus mengubah hierarki tampilan. Misalnya tidak ada kode di atas yang berfungsi untuk iOS9.

Saya pikir lebih aman untuk hanya menemukan tampilan teratas, dengan [[[UIAplikasi sharedApplication] windows] lastObject], dan cukup tambahkan tombol di sudut kiri bawahnya, dilakukanButton.frame = CGRectMake (0, SCREEN_HEIGHT-53, 106 , 53); // mode potret


0

Swift 2.2 / Saya menggunakan jawaban Dx_. Namun, saya menginginkan fungsi ini di semua keyboard. Jadi di kelas dasar saya memasukkan kode:

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

Kemudian panggil addDoneButtonForTextFields di self.view.subviews dalam viewDidLoad (atau willDisplayCell jika menggunakan tampilan tabel) untuk menambahkan tombol Done ke semua keyboard.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.