Ios 如何启用/禁用UITextField';s inputAccessoryView按钮?

Ios 如何启用/禁用UITextField';s inputAccessoryView按钮?,ios,objective-c,inputaccessoryview,Ios,Objective C,Inputaccessoryview,我已经创建了一个UIToolBar作为inputAccessoryView,其中包含一个“下一个”和“上一个”按钮,该按钮将在我的视图控制器中的文本字段中循环 我已经在UITextField上创建了一个基于的类别,它向textField添加了一个指向下一个/上一个textField的属性 我可以让它在文本字段中前后循环,但只能循环一次,然后我的按钮将被永久禁用。此外,当最后一个文本字段处于焦点时,我还需要再点击下一个按钮一次(3个文本字段点击4次),以使其禁用下一个按钮-与上一个按钮相同,当我在

我已经创建了一个UIToolBar作为inputAccessoryView,其中包含一个“下一个”和“上一个”按钮,该按钮将在我的视图控制器中的文本字段中循环

我已经在UITextField上创建了一个基于的类别,它向textField添加了一个指向下一个/上一个textField的属性

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

// 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];
    }
}
//ViewController.h
@界面详细信息ViewController:UIViewController{
__弱ibuitextfield*valueField;
__弱ibuitextfield*nameField;
__弱ibuitextfield*serialNumberField;
}
@属性(非原子,强)UITextField*currentTextField;
-(iAction)nextTextField:(id)发送方;
-(iAction)prevTextField:(id)发件人;
//ViewController.m
-(无效)viewDidLoad{
//...
nameField.delegate=self;
nameField.nextTextField=serialNumberField;
nameField.prevTextField=nil;
serialNumberField.delegate=self;
serialNumberField.nextTextField=valueField;
serialNumberField.prevTextField=名称字段;
valueField.delegate=self;
valueField.prevTextField=serialNumberField;
valueField.nextTextField=nil;
//...
}
-(无效)视图将显示:(BOOL)动画{
//inputAccessoryView的UIToolBar
UIToolbar*工具栏=[[UIToolbar alloc]initWithFrame:CGRectMake(0,0,self.view.frame.size.width,50)];
UIBarButtonItem*nextField=[[UIBarButtonItem alloc]initWithTitle:@“\U00003009”
风格:uibarbuttonimstyleplain
目标:自我
操作:@selector(nexttexfield:)];
UIBarButtonItem*prevField=[[UIBarButtonItem alloc]initWithTitle:@“\U00003008”
风格:uibarbuttonimstyleplain
目标:自我
操作:@选择器(prevTextField:)];
UIBarButtonItem*space=[[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarbuttonSystemFlexibleSpace目标:无操作:无];
UIBarButtonItem*done=[[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarbuttonSystemDone目标:自我操作:@selector(backgroundTapped:)];
NSArray*工具栏按钮=@[prevField,nextField,space,done];
toolBar.items=工具栏按钮;
nameField.inputAccessoryView=工具栏;
valueField.inputAccessoryView=工具栏;
serialNumberField.inputAccessoryView=工具栏;
}
-(iAction)nextTextField:(id)发件人{
UITextField*next=self.currentTextField.nextTextField;
如果(!下一个){
[发送方设置已启用:否];
}否则{
[发送方设置已启用:是];
[下一步成为第一响应者];
}
}
-(iAction)prevTextField:(id)发件人{
UITextField*prev=self.currentTextField.prevTextField;
如果(!prev){
[发送方设置已启用:否];
}否则{
[发送方设置已启用:是];
[先前成为第一反应者];
}
}

我认为部分问题在于,您正在使用一种方法来处理条形按钮的启用/禁用,该方法仅在点击其中一个条形按钮后调用。最好将BarButtonims设置为视图控制器的属性(以便您可以在需要时启用/禁用它们),然后在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];
    }
}