2013-12-17 4 views
2

Я создал UIToolBar как inputAccessoryView со следующей и предыдущими кнопками, которые будут циклически проходить через текстовые поля в моем контроллере представления.Как включить/отключить кнопки ввода InputAccessoryView UITextField?

Я создал категорию на UITextField на основе third SO answer on this page, которая добавляет свойство textField, указывающее на следующий/предыдущий textField.

Я могу заставить его циклически перемещаться по текстовым полям как вперед, так и назад, но только один раз, а затем мои кнопки постоянно отключены. Кроме того, когда последний textField находится в фокусе, мне все равно нужно нажать следующую кнопку на одно дополнительное время (4 ответвления для 3 текстовых полей), чтобы отключить следующую кнопку - то же самое с предыдущей кнопкой, я должен нажать один раз, когда я '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]; 
    } 
} 
Смежные вопросы