Конфликт UIPicker и клавиатуры

у меня есть 3 текстовых поля, и всякий раз, когда я касаюсь textField1 или textField2, средство выбора меняет значения, а клавиатуры нет. Когда я касаюсь клавиатуры textField3, появляется клавиатура, и средство выбора скрывается. Теперь, если я отклоняю клавиатуру, нажимая «Возврат», а затем нажимаю средство выбора textField1, появляется снова, но если я не закрываю клавиатуру, НАЖИМАЯ КНОПКУ, она остается над средством выбора. Что мне нужно, так это то, что клавиатура firstResponder (и я вижу ее на экране), чтобы скрыть ее, если я нажму на textField1 и только увижу средство выбора

int variabla;

    -(void)textFieldDidBeginEditing:(UITextField *)textField{
        [pickerView setHidden:YES];
        if (textField1.editing == YES) {
            [textField1 resignFirstResponder];
            [pickerView setHidden:NO];
            variabla = 1;
        }else if (textField2.editing == YES) {  
            [textField2 resignFirstResponder];
            [pickerView setHidden:NO];
            variabla = 2;
        }   
        NSLog(@"variabla %d",variabla); 
        [pickerView reloadAllComponents];
    }

    - (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView;
    {
        return 1;
    }
    - (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component;
    {
        if (variabla == 1) {
            return [pickerArray1 count];
        }else if (variabla == 2) {
            return [pickerArray2 count];
        }else {
            return 0;
        }   
    }
    - (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component;
    {   
        if (variabla == 1) {
            return [pickerArray1 objectAtIndex:row];        
        }else if (variabla == 2) {
            return [pickerArray2 objectAtIndex:row];
        }else {
            return 0;
        }   
    }
    - (void)textFieldShouldReturn:(UITextField *)textField{ 
        [textField resignFirstResponder];
    }
- (void)viewDidLoad {
    [super viewDidLoad];
    [pickerView setHidden:YES];
    pickerArray1 = [[NSMutableArray alloc] initWithObjects:@"0", @"1", @"2", nil];
    pickerArray2 = [[NSMutableArray alloc] initWithObjects:@"3", @"4", @"5", nil];
}

person Spire    schedule 03.12.2010    source источник


Ответы (3)


Хорошо, для решения этой проблемы вы можете использовать множество вариантов, я расскажу вам один из них.

- (void)textFieldShouldBeginEditing:(UITextField *)textField {

  if([textField isEqual:yourTextField3])
  {
    yourPicker.hidden=YES;
  }
  else
  {

    [yourTextField3 resignFirstResponder];
    [self performSelector:@selector(textFieldFirstResponderOnDelay) withObject:nil afterDelay:0.3];
  }
}


- (void)textFieldFirstResponderOnDelay {
  yourPicker.hidden=NO;
}

И все, что вы хотите, вы можете вложить в эти условия.

или вы можете добавить тег к своему текстовому полю и проверить соответственно. Скрыть средство выбора, когда захотите, или отобразить средство выбора и скрыть клавиатуру, когда захотите.

person Ishu    schedule 03.12.2010
comment
@spire, это определенно работает, но то, как вы используете это, зависит от вас. И на это отвечает Ишу. - person Ishu; 03.12.2010
comment
Бро, ты пропустил кое-что, хорошо, дай часть кода, чтобы проверить ошибку, она определенно работает, я использую это несколько раз. - person Ishu; 03.12.2010
comment
используйте отредактированный (измените TextField на textField. Это может вам помочь. - person Ishu; 03.12.2010
comment
Извините за имя, вот код --- -(void)textFieldDidBeginEditing:(UITextField *)textField { if([textField isEqual:textField3]) { pickerView.hidden=YES; } еще { pickerView.hidden=НЕТ; [textField3 resignFirstResponder]; если (textField1.editing == YES) { variabla = 1; } else if (textField2.editing == YES) { variabla = 2; } NSLog(@variabla %d,variabla); [pickerView reloadAllComponents]; } } - person Spire; 03.12.2010
comment
Вы также пропустили квадратные скобки, но это не главное, я знаю, что вы имели в виду, я добавлю весь код в ответ, чтобы вы могли его увидеть. - person Spire; 03.12.2010
comment
Хм, я тоже редактирую это. Проверьте OnDelay. С этой проблемой я также сталкиваюсь на iPhone 4.0 или выше. - person Ishu; 03.12.2010
comment
Также измените DidBegainEditing на shouldBegainEditing. - person Ishu; 03.12.2010
comment
сделал некоторые изменения, но ... почти идеально, теперь мне нужно только дважды нажать на textField3, чтобы клавиатура могла появиться в первый раз, когда скрывается идентификатор Picker, а во второй раз появляется клавиатура. Также мне нужно сначала щелкнуть textField1 или 2, только затем я можно нажать на textField3 - person Spire; 03.12.2010
comment
вы хотите отключить редактирование textField3, пока не произойдет нажатие на textField1 или 2 справа. Для этого вы отключаете textField3 в viewWillAppear или viewDidLoad, а затем блокируете (в приведенном выше коде) ваш textField3. - person Ishu; 03.12.2010
comment
Нет, вы меня неправильно поняли, textField3 отключен с помощью предоставленного вами кода, и я хочу его включить. С вашим кодом First Responder должен быть инициализирован с помощью textField1 или textField2, чтобы textField3 мог вызывать клавиатуру - person Spire; 03.12.2010

  @implementation UIPickerViewController
    int variabla;
    -(void)textFieldDidBeginEditing:(UITextField *)textField {

        if([textField isEqual:textField3])
        {
            pickerView.hidden=YES;
        }
        else
        {
            pickerView.hidden=NO;
            [textField3 resignFirstResponder];
            if (textField1.editing == YES) {            
                variabla = 1;
            }else if (textField2.editing == YES) {          
                variabla = 2;
            }
            NSLog(@"variabla %d",variabla); 
            [pickerView reloadAllComponents];
        }   
    }

    - (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView;
    {
        return 1;
    }
    - (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component;
    {
        if (variabla == 1) {
            return [pickerArray1 count];
        }else if (variabla == 2) {
            return [pickerArray2 count];
        }else {
            return 0;
        }   
    }
    - (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component;
    {   
        if (variabla == 1) {
            return [pickerArray1 objectAtIndex:row];        
        }else if (variabla == 2) {
            return [pickerArray2 objectAtIndex:row];
        }else {
            return 0;
        }   
    }
    - (BOOL)textFieldShouldReturn:(UITextField
*)textField{    
        [textField resignFirstResponder];
        return YES;
    }
    - (void)viewDidLoad {
        [super viewDidLoad];
        [pickerView setHidden:YES];
        pickerArray1 = [[NSMutableArray alloc] initWithObjects:@"0", @"1", @"2", nil];
        pickerArray2 = [[NSMutableArray alloc] initWithObjects:@"3", @"4", @"5", nil];
    }

и файл .h

@interface UIPickerViewController : UIViewController <UIPickerViewDelegate, UIPickerViewDataSource> {

    IBOutlet UIPickerView *pickerView;
    IBOutlet UITextField *textField1;
    IBOutlet UITextField *textField2;
    IBOutlet UITextField *textField3;
    NSArray *pickerArray1;
    NSArray *pickerArray2;
    UIButton *hideKeyboardButton;

}
-(void)textFieldDidBeginEditing:(UITextField *)textField;
@end
person Spire    schedule 03.12.2010
comment
используйте textFieldShouldBeginEditing вместо textFieldDidBeginEditing. - person Ishu; 03.12.2010
comment
Но тогда textField3 не может стать первым ответчиком, и клавиатура не отображается, когда я нажимаю на нее. Мне нужно дважды щелкнуть по нему, чтобы появилась клавиатура. - person Spire; 03.12.2010

Получил THX за вашу помощь

-(void)textFieldShouldBeginEditing:(UITextField *)textField {
    pickerView.hidden=YES;
    if ([textField isEqual:textField3]) {

    }
    else if([textField isEqual:textField1])
    {
        [textField3 resignFirstResponder];
        [self performSelector:@selector(textFieldFirstResponderOnDelay1) withObject:nil afterDelay:0.1];
    }else {
        [textField3 resignFirstResponder];
        [self performSelector:@selector(textFieldFirstResponderOnDelay2) withObject:nil afterDelay:0.1];
    }
}

-(void)textFieldFirstResponderOnDelay1{ 
    pickerView.hidden=NO;
    variabla = 1;

    NSLog(@"variabla %d",variabla); 
    [pickerView reloadAllComponents];
}
-(void)textFieldFirstResponderOnDelay2{ 

    pickerView.hidden=NO;
    variabla = 2;

    NSLog(@"variabla %d",variabla); 
    [pickerView reloadAllComponents];
}

средство выбора должно быть инициализировано перед касанием textField3

person Spire    schedule 03.12.2010