如何启用/禁用 UITextField 的 inputAccessoryView 按钮?

Posted

技术标签:

【中文标题】如何启用/禁用 UITextField 的 inputAccessoryView 按钮?【英文标题】:How can I enable/disable a UITextField's inputAccessoryView buttons? 【发布时间】:2013-12-17 20:17:45 【问题描述】:

我创建了一个 UIToolBar 作为 inputAccessoryView,其中包含一个下一个和上一个按钮,这些按钮将在我的视图控制器中的 textFields 中循环。

我在 UITextField 上创建了一个基于 third SO answer on this page 的类别,它向指向下一个/上一个 textField 的 textField 添加了一个属性。

我可以让它在文本字段中向前和向后循环,但只能循环一次,然后我的按钮将被永久禁用。此外,当最后一个 textField 处于焦点时,我仍然需要再次点击下一个按钮(4 个点击 3 个 textFields)才能禁用下一个按钮 - 与上一个按钮相同,我必须点击一次后我'm 在第一个文本字段中。

// ViewController.h
@interface DetailViewController : UIViewController <UINavigationControllerDelegate, UIImagePickerControllerDelegate, UITextFieldDelegate, UIPopoverControllerDelegate> 

    __weak IBOutlet UITextField *valueField;
    __weak IBOutlet UITextField *nameField;
    __weak IBOutlet UITextField *serialNumberField;



@property (nonatomic, strong) UITextField *currentTextField;

- (IBAction)nextTextField:(id)sender;
- (IBAction)prevTextField:(id)sender;


// ViewController.m
- (void)viewDidLoad 
    //...

    nameField.delegate = self;
    nameField.nextTextField = serialNumberField;
    nameField.prevTextField = nil;

    serialNumberField.delegate = self;
    serialNumberField.nextTextField = valueField;
    serialNumberField.prevTextField = nameField;

    valueField.delegate = self;
    valueField.prevTextField = serialNumberField;
    valueField.nextTextField = nil;

    //...


- (void)viewWillAppear:(BOOL)animated 
    //UIToolBar for inputAccessoryView
    UIToolbar *toolBar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 50)];
    UIBarButtonItem *nextField = [[UIBarButtonItem alloc] initWithTitle:@"\U00003009"
                                                                  style:UIBarButtonItemStylePlain
                                                                 target:self
                                                                 action:@selector(nextTextField:)];
    UIBarButtonItem *prevField = [[UIBarButtonItem alloc] initWithTitle:@"\U00003008"
                                                                  style:UIBarButtonItemStylePlain
                                                                 target:self
                                                                 action:@selector(prevTextField:)];
    UIBarButtonItem *space = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
    UIBarButtonItem *done = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(backgroundTapped:)];
    NSArray *toolBarButtons = @[prevField, nextField, space, done];
    toolBar.items = toolBarButtons;

    nameField.inputAccessoryView  = toolBar;
    valueField.inputAccessoryView = toolBar;
    serialNumberField.inputAccessoryView = toolBar;


    - (IBAction)nextTextField:(id)sender 
    UITextField *next = self.currentTextField.nextTextField;

    if (!next) 
        [sender setEnabled:NO];
     else 
        [sender setEnabled:YES];
        [next becomeFirstResponder];
    



- (IBAction)prevTextField:(id)sender 
    UITextField *prev = self.currentTextField.prevTextField;

    if (!prev) 
        [sender setEnabled:NO];
     else 
        [sender setEnabled:YES];
        [prev becomeFirstResponder];
    

【问题讨论】:

【参考方案1】:

我认为部分问题在于您正在处理启用/禁用栏按钮的方法,该方法仅在点击其中一个栏按钮后才调用。最好将 barbuttonitems 设置为视图控制器的属性(以便您可以在需要时启用/禁用它们),然后在 UITextField 的“textFieldShouldBeginEditing”委托方法中处理启用/禁用栏按钮项。

所以,是这样的:

- (void)viewWillAppear:(BOOL)animated 
    //UIToolBar for inputAccessoryView
    UIToolbar *toolBar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 50)];
    self.moveToNextFieldButton = [[UIBarButtonItem alloc] initWithTitle:@"\U00003009"
                                                                  style:UIBarButtonItemStylePlain
                                                                 target:self
                                                                 action:@selector(nextTextField:)];
    self.moveToPrevFieldButton = [[UIBarButtonItem alloc] initWithTitle:@"\U00003008"
                                                                  style:UIBarButtonItemStylePlain
                                                                 target:self
                                                                 action:@selector(prevTextField:)];
    UIBarButtonItem *space = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
    UIBarButtonItem *done = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(backgroundTapped:)];
    NSArray *toolBarButtons = @[self.moveToPrevFieldButton, self.moveToNextFieldButton, space, done];
    toolBar.items = toolBarButtons;

    nameField.inputAccessoryView  = toolBar;
    valueField.inputAccessoryView = toolBar;
    serialNumberField.inputAccessoryView = toolBar;


-(BOOL)textFieldShouldBeginEditing:(UITextField*)textField

    UITextField *next = textField.nextTextField;
    UITextField *prev = textField.prevTextField;
    self.moveToNextFieldButton.enabled = next != nil;
    self.moveToPrevFieldButton.enabled = prev != nil;

    return YES;


- (IBAction)nextTextField:(id)sender 
    UITextField *next = self.currentTextField.nextTextField;

    if (next) 
        [next becomeFirstResponder];
     



- (IBAction)prevTextField:(id)sender 
    UITextField *prev = self.currentTextField.prevTextField;

    if (prev) 
        [prev becomeFirstResponder];
    

【讨论】:

以上是关于如何启用/禁用 UITextField 的 inputAccessoryView 按钮?的主要内容,如果未能解决你的问题,请参考以下文章

Swift:如何使用 UISwitch 控制 UITextField 通过委托启用或禁用

启用/禁用 UIButton 取决于 UITextField 中的文本长度

在 UITableView 中编辑 UITextField(启用/禁用输入)?

无法启用禁用的输入[重复]

如何检测 UITextField 上的点击?

UITextField 具有焦点时未禁用 UIButton