Cách hiển thị nút Done Done trên bảng số iPhone


237

Không có nút "Xong" trên bàn phím số. Khi người dùng hoàn thành việc nhập thông tin số vào trường văn bản, làm cách nào tôi có thể làm cho bảng số biến mất?

Tôi có thể nhận được nút "Xong" bằng cách sử dụng bàn phím mặc định, nhưng sau đó người dùng sẽ phải chuyển sang các phím số để nhập số. Có cách nào để hiển thị nút "Xong" trên bàn phím số không?

Câu trả lời:


339

Giải pháp khác. Hoàn hảo nếu có các trường văn bản pad không số khác trên màn hình.

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
Không có nghi ngờ cách tốt nhất để thực hiện điều này. Rõ ràng bởi vì nó tuân thủ HIG nghiêm ngặt.
Hubert Kunnemeyer

3
Giải pháp khác rất dễ vỡ về bất kỳ thay đổi đồ họa nào đối với bàn phím trên màn hình sẽ phá vỡ nó.
kailoon

Nếu có nhiều trường văn bản, làm cách nào để xác định UITextField nào đang được chỉnh sửa?
Nate

Xác định UITextField của bạn trong .h dưới dạng biến thể hiện.
Luda

3
@BenPotter Bạn sẽ đặt barTint cho màu thanh và màu sắc cho văn bản. Bạn cũng có thể tạo các mục UIBarButton bên ngoài của intializer và đặt màu cho chúng rõ ràng ở đó.
vào

50

Đây là bản phóng tác cho câu trả lời của Luda dành cho Swift:

Trong phần khai báo của lớp con UIViewControll của bạn, hãy đặt

let numberToolbar: UIToolbar = UIToolbar()

trong ViewDidLoad đặt:

    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 

và thêm chức năng hoopla và hoopla (thoải mái chọn tên khác, chỉ cần thay đổi tên bộ chọn trong ViewDidLoad cho phù hợp

func boopla () {
    textField.resignFirstResponder()
}

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

1
UIBarButtonItemStyle.Borderedkhông dùng nữa kể từ iOS 8.0. UIBarButtonItemStyle.Plainđược đề nghị thay thế.
Jonny

Các bộ chọn phải được cập nhật thành: #selector (YourViewControll.boopla)
David V

Jonny và David có lẽ đúng. Tôi không lập trình cho iOS nữa nên tôi không theo dõi các thay đổi. Nếu bất cứ ai đăng một giải pháp cập nhật, tôi sẽ tham khảo nó trong một chỉnh sửa.
dùng1258240

14

Thủ thuật mà tôi đã thấy được sử dụng là tạo một nút trong suốt tùy chỉnh kích thước của toàn bộ chế độ xem và sau đó trong phương thức nhấp chuột của nó, có trường văn bản từ chức phản hồi đầu tiên. Vì vậy, người dùng có thể nhấp vào bất cứ nơi nào bên ngoài trường để loại bỏ bàn phím.


3
Tôi đã làm điều này ngoài phím Return. Nó làm cho một ứng dụng thân thiện hơn nhiều. Tôi muốn cung cấp cho cả các phím trả về và nhấp vào bất cứ nơi nào phương thức trả về.
IcyBlueRose

4
bây giờ chúng ta có UIGestureRecognators, chỉ cần thiết lập trình nhận dạng cử chỉ nhấn trên chế độ xem của trình điều khiển chế độ xem chính và để nó gửi kết thúc Chỉnh sửa: CÓ cho chế độ xem của nó. Thao tác này sẽ đóng bàn phím cho mọi trường văn bản mà bàn phím có thể được bảo trì khi chạm vào bên ngoài bàn phím.
chadbag

13

Một giải pháp Swift 3 sử dụng một phần mở rộng. Lý tưởng nếu bạn có một số UITextFieldđối tượng số trong ứng dụng của mình vì nó cho phép linh hoạt quyết định, đối với từng đối tượng UITextField, liệu có thực hiện hành động tùy chỉnh khi Xong hoặc Hủy được gõ hay không.

nhập mô tả hình ảnh ở đây

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

Ví dụ về việc sử dụng các hành động mặc định:

//
// MyViewController.swift
//

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

Ví dụ về việc sử dụng bằng hành động Xong tùy chỉnh :

//
// MyViewController.swift
//

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

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

12

Dưới đây là đại tu câu trả lời của Luda với những thay đổi sau:

  • Chế độ xem phụ kiện được tự động định cỡ theo chiều rộng của khung ứng dụng

  • hằng số không UIBarButtonItemStyleBordereddùng được

  • nút "Xong" được khởi tạo như một UIBarButtonSystemItemDone

Hiện tại nút "Xong" được đặt ở giữa trong giao diện phụ kiện. Bạn có thể đặt nó ở bên trái hoặc bên phải bằng cách xóa khoảng trống ở phía thích hợp.

Tôi đã bỏ qua nút "Hủy" vì bàn phím mặc định cũng không có nút nào. Nếu bạn thực sự muốn có nút "Hủy", tôi khuyên bạn nên khởi tạo nó dưới dạng UIBarButtonSystemItemCancelvà bạn đảm bảo rằng bạn không loại bỏ giá trị gốc trong trường văn bản của mình. Hành vi "Hủy" được triển khai trong câu trả lời của Luda, ghi đè giá trị bằng một chuỗi trống, có thể không phải là điều bạn muốn.

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

Để biết thêm thông tin về cách xây dựng chế độ xem phụ kiện, hãy xem tài liệu của Apple về chế độ xem tùy chỉnh để nhập dữ liệu . Bạn có thể sẽ muốn tham khảo các trang tham khảo trên UIToolbarUIBarButtonItem .


[UIScreen mainScreen].applicationFramekhông được dùng nữa trong iOS 9. Sử dụng[UIScreen mainScreen].bounds
user-44651

11

Giải pháp trong UIKeyboardTypeNumberPad và phím trả về bị thiếu hoạt động tuyệt vời nhưng chỉ khi không có các trường văn bản pad không số khác trên màn hình.

Tôi đã lấy mã đó và biến nó thành một UIViewControll mà bạn có thể chỉ cần phân lớp để làm cho các bảng số hoạt động. Bạn sẽ cần lấy các biểu tượng từ liên kết trên.

NumberPadViewControll.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

và NumberPadViewControll.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

Thưởng thức.


6

Đây là mã gần đây nhất. Chỉ cần bao gồm #import "UIViewControll + NumPadReturn.h" trong viewContoder của bạn.

Đây là .h

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

@interface UIViewController (NumPadReturn)



@end

Và họ

#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

điều này dường như hoạt động trên trình giả lập nhưng trên thiết bị ... tôi không thể thấy nút DONE cũng như không có gì xảy ra khi tôi chạm vào khoảng trống ... có ý kiến ​​gì không?
xoail

14
Ồ, xin đừng sử dụng mã này. Bạn áp dụng các phương thức lớp từ bên trong một danh mục, điều này sẽ khiến viewDidLoad "thực", v.v ... từ lớp UIViewControll của bạn bị bỏ qua.
Tony Arnold

6

Một giải pháp dễ dàng hơn nhiều

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

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

5

Nếu bạn có nhiều trường số, tôi khuyên bạn nên phân lớp UITextField để tạo NumericTextField luôn hiển thị bàn phím số với một nút thực hiện. Sau đó, chỉ cần liên kết các trường số của bạn với lớp này trong Trình tạo giao diện và bạn sẽ không cần bất kỳ mã bổ sung nào trong bất kỳ Bộ điều khiển xem nào của bạn. Sau đây là lớp Swift 3.0 mà tôi đang sử dụng trong 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()
    }
}

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

Tôi thích giải pháp phụ của bạn.
AechoLiu

5

Tôi thấy câu trả lời của @ user1258240 khá ngắn gọn vì điều này không đơn giản như đặt mộtreturnKeyType tính.

Chỉ muốn đóng góp cách tiếp cận "có thể sử dụng lại" của riêng tôi cho việc này:

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 Một hương vị khác nhau, sử dụng các phần của một số câu trả lời trước đó.

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

Tôi mô tả một giải pháp cho iOS 4.2+ ở đây nhưng nút bỏ qua sẽ mờ dần sau khi bàn phím xuất hiện. Nó không khủng khiếp, nhưng cũng không lý tưởng.

Giải pháp được mô tả trong câu hỏi được liên kết ở trên bao gồm một ảo ảnh thanh lịch hơn để loại bỏ nút, trong đó tôi làm mờ dần và dịch chuyển theo chiều dọc của nút để cung cấp sự xuất hiện mà bàn phím và nút bị loại bỏ cùng nhau.


2

Cách đơn giản nhất là:

Tạo nút trong suốt tùy chỉnh và đặt nó ở góc dưới bên trái, sẽ có cùng CGSizekhoảng trống UIKeyboardTypeNumberPad. Chuyển đổi (hiển thị / ẩn) nút này trên textField becomeFirstResponder, nhấp vào nút tương ứng.


2

Đây là giải pháp đơn giản nhất mà tôi đã đi qua. Tôi đã học được điều này từ cuốn sách Bắt đầu phát triển iOS 5.

Giả sử trường số được gọi numberField.

  1. Trong ViewController, thêm phương thức sau:

    -(IBAction)closeKeyboard:(id)sender;
  2. Trong ViewController.m, thêm mã sau đây:

    -(IBAction)closeKeyboard:(id)sender
    {
    
         [numberField resignFirstResponder];
    
    }
  3. Quay trở lại nibtập tin.

  4. Mở Utilitieschảo.
  5. Mở chảo Identity inspectordưới Utilities.
  6. Nhấp vào View(trong tệp nib) một lần. Hãy chắc chắn rằng bạn chưa nhấp vào bất kỳ mục nào trong chế độ xem. Vì mục đích làm rõ, bạn sẽ thấy UIView dưới Classtrong Identity inspector.
  7. Thay đổi lớp từ UIView thành UIControl.
  8. Mở Connection Inspector.
  9. Nhấp và kéo Touch Downvà thả mũi tên vào File Ownerbiểu tượng. (FYI ... Biểu tượng Chủ sở hữu tệp được hiển thị ở bên trái Viewvà xuất hiện dưới dạng khối lập phương rỗng với khung màu vàng.)
  10. Chọn phương thức : closeKeyboard.
  11. Chạy chương trình.

Bây giờ khi bạn nhấp vào bất cứ nơi nào trên nền của View, bạn sẽ có thể loại bỏ bàn phím.

Hy vọng điều này sẽ giúp bạn giải quyết vấn đề của bạn. :-)


2

Tôi đã sửa đổi giải pháp của Bryan trở nên mạnh mẽ hơn một chút, để nó có thể chơi tốt với các loại bàn phím khác có thể xuất hiện trong cùng một chế độ xem. Nó được mô tả ở đây:

Tạo nút DONE trên UIKeyboard numpad iOS

Tôi sẽ cố gắng giải thích nó ở đây, nhưng hầu hết là mã để xem xét điều đó sẽ không dễ dàng phù hợp ở đây


Đây là giải pháp tốt nhất mà tôi tìm thấy cho XCode 4.5 và nó hoạt động với iOS 6.0. Nó thêm nút DONE vào bàn phím số. Đi đến bài viết gốc để có được đồ họa nút DONE. neoos.ch/blog/ từ
chim

2

Nếu bạn biết trước số lượng số được nhập (ví dụ: mã PIN gồm 4 chữ số), bạn có thể tự động loại bỏ sau 4 lần nhấn phím, theo câu trả lời của tôi cho câu hỏi tương tự này:

cách chức số Pad

Không cần một nút thực hiện bổ sung trong trường hợp này.


2

Chúng tôi cũng có thể làm cho giải pháp "người dùng chạm vào một nơi khác" thậm chí còn đơn giản hơn nếu chúng tôi chỉ cho biết quan điểm của bộ điều khiển xem của chúng tôi để kết thúc chỉnh sửa:

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

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

... Giả sử rằng "chạm vào nơi khác sẽ tắt bàn phím" là hành vi mong muốn đối với bất kỳ trường có thể chỉnh sửa nào khác trên chế độ xem.


1

Đối với Swift 2.2 tôi sử dụng cái này

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

Tất cả những gì thực hiện về việc tìm chế độ xem bàn phím và thêm nút thực hiện ở hàng thứ 3 (đó là lý do tại sao button.y = 163 b / c chiều cao bàn phím là 216) rất mong manh vì iOS luôn thay đổi thứ bậc chế độ xem. Ví dụ: không có mã nào ở trên hoạt động cho iOS9.

Tôi nghĩ sẽ an toàn hơn khi chỉ cần tìm chế độ xem trên cùng, bởi [[[UIApplication sharedApplication] windows] lastObject], và chỉ cần thêm nút ở góc dưới bên trái của nó, xongButton.frame = CGRectMake (0, SCREEN_HEIGHT-53, 106 , 53); // chế độ chân dung


0

Swift 2.2 / Tôi đã sử dụng câu trả lời của Dx_. Tuy nhiên, tôi muốn chức năng này trên tất cả các bàn phím. Vì vậy, trong lớp cơ sở của tôi, tôi đặt mã:

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

Sau đó, chỉ cần gọi addDoneButtonForTextFields trên self.view.subview trong viewDidLoad (hoặc willDisplayCell nếu sử dụng chế độ xem bảng) để thêm nút Xong vào tất cả các bàn phím.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.