Как я могу включить/отключить кнопки inputAccessoryView UITextField?

Я создал UIToolBar как inputAccessoryView с кнопками «Далее» и «Предыдущий», которые будут циклически перемещаться по текстовым полям в моем контроллере представления.

Я создал категорию в UITextField на основе третьего ответа SO на этот вопрос. page, которая добавляет к текстовому полю свойство, указывающее на следующее/предыдущее текстовое поле.

Я могу заставить его циклически перемещаться по текстовым полям как вперед, так и назад, но только один раз, и тогда мои кнопки навсегда отключены. Кроме того, когда последнее текстовое поле находится в фокусе, мне все равно нужно нажать следующую кнопку еще раз (4 нажатия для 3 текстовых полей), чтобы она отключила следующую кнопку — то же самое с предыдущей кнопкой, мне нужно нажать назад один раз, когда я нахожусь в первом текстовом поле.

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

person se_puede_dev    schedule 17.12.2013    source источник


Ответы (1)


Я думаю, что часть проблемы заключается в том, что вы обрабатываете включение/отключение кнопок панели в методе, который вызывается только после нажатия одной из кнопок панели. Было бы лучше установить элементы панели как свойства вашего контроллера представления (чтобы вы могли включать/отключать их, когда хотите), а затем обрабатывать включение/отключение элементов кнопки панели в методе делегата 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];
    }
}
person tjboneman    schedule 17.12.2013