• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

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

[复制链接]
菜鸟教程小白 发表于 2022-12-12 17:12:17 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

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

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

我可以让它在文本字段中向前和向后循环,但只能循环一次,然后我的按钮将被永久禁用。此外,当最后一个 textField 处于焦点时,我仍然需要再点击一次下一个按钮(3 个 textFields 的 4 次点击)以禁用下一个按钮 - 与上一个按钮相同,我必须点击一次后我'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)nextTextFieldid)sender;
- (IBAction)prevTextFieldid)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)viewWillAppearBOOL)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
                                                                 actionselector(nextTextField];
    UIBarButtonItem *prevField = [[UIBarButtonItem alloc] initWithTitle"\U00003008"
                                                                  style:UIBarButtonItemStylePlain
                                                                 target:self
                                                                 actionselector(prevTextField];
    UIBarButtonItem *space = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
    UIBarButtonItem *done = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self actionselector(backgroundTapped];
    NSArray *toolBarButtons = @[prevField, nextField, space, done];
    toolBar.items = toolBarButtons;

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

    - (IBAction)nextTextFieldid)sender {
    UITextField *next = self.currentTextField.nextTextField;

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


- (IBAction)prevTextFieldid)sender {
    UITextField *prev = self.currentTextField.prevTextField;

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



Best Answer-推荐答案


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

所以,是这样的:

- (void)viewWillAppearBOOL)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
                                                                 actionselector(nextTextField];
    self.moveToPrevFieldButton = [[UIBarButtonItem alloc] initWithTitle"\U00003008"
                                                                  style:UIBarButtonItemStylePlain
                                                                 target:self
                                                                 actionselector(prevTextField];
    UIBarButtonItem *space = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
    UIBarButtonItem *done = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self actionselector(backgroundTapped];
    NSArray *toolBarButtons = @[self.moveToPrevFieldButton, self.moveToNextFieldButton, space, done];
    toolBar.items = toolBarButtons;

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

-(BOOL)textFieldShouldBeginEditingUITextField*)textField{

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

    return YES;
}

- (IBAction)nextTextFieldid)sender {
    UITextField *next = self.currentTextField.nextTextField;

    if (next) {
        [next becomeFirstResponder];
    } 
}


- (IBAction)prevTextFieldid)sender {
    UITextField *prev = self.currentTextField.prevTextField;

    if (prev) {
        [prev becomeFirstResponder];
    }
}

关于ios - 如何启用/禁用 UITextField 的 inputAccessoryView 按钮?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20643827/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap