#ios #uipickerview
#iOS #uipickerview
Вопрос:
Я пытаюсь заставить UIPickerView отображаться, когда пользователь нажимает на UITextField, я должен увидеть выходы источника данных и делегата, чтобы связать их с средством выбора, однако он не завершается, когда я открываю файл nib-> нажмите на владельца файла -> инспектор вторая проблема заключается в том, что клавиатура не скрывается, когда я нажимаю на UITextField, хотя я создал textFieldShouldReturn
метод, который предполагает скрытие клавиатуры.
Чего мне здесь не хватает?
файл .h:
@interface RechercherViewController : UIViewController<UIPickerViewDataSource,UIPickerViewDelegate,UITextFieldDelegate> {
IBOutlet UIPickerView *pickerTypesCarburants;
IBOutlet UIView *pickerViewTypesCarburants;
NSMutableArray *typesCarburantsArray;
IBOutlet UITextField *typeCarburantTextField;
}
-(IBAction)pickerTypeCarburantsShow;
-(IBAction)pickerTypeCarburantsDone;
@end
файл .m :
-(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)thePickerView{
return 1;
}
-(NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component{
return [typesCarburantsArray count];
}
-(NSString *)pickerView:(UIPickerView *)thePickerView titleForRow:(NSInteger)row forComponent:(NSInteger) component{
return [typesCarburantsArray objectAtIndex:row];
}
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
UITouch *touch;
touch=[touches anyObject];
CGPoint point=[touch locationInView:self.view];
if(CGRectContainsPoint([typeCarburantTextField frame],point))
{
[self pickerTypeCarburantsShow];
}
}
-(IBAction)pickerTypeCarburantsDone{
NSInteger selectedRow=[pickerTypesCarburants selectedRowInComponent:0];
NSString *item=[typesCarburantsArray objectAtIndex:selectedRow];
typeCarburantTextField.text=[NSString stringWithFormat:@"%@",item];
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:0.5];
CGAffineTransform transform=CGAffineTransformMakeTranslation(0, 480);
pickerViewTypesCarburants.transform=transform;
[UIView commitAnimations];
}
-(IBAction)pickerTypeCarburantsShow{
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:0.5];
CGAffineTransform transform=CGAffineTransformMakeTranslation(0, 240);
pickerViewTypesCarburants.transform=transform;
[self.view addSubview:pickerViewTypesCarburants];
[UIView commitAnimations];
}
-(BOOL)textFieldShouldReturn:(UITextField *)textField{
[textField resignFirstResponder];
return YES;
}
Ответ №1:
Прежде всего, вам, вероятно, не следует пытаться заставить UIPickerView отображаться при нажатии на UITextField, поскольку это нестандартное поведение (особенно если вы отключаете клавиатуру). Похоже, вам нужна стандартная кнопка UIButton, которая при нажатии представляет UIPickerView, поскольку это имело бы больше смысла.
В любом случае, если вы не видите выходы источника данных и делегата в IB, попробуйте применить их вручную в своем коде.
pickerTypesCarburants.delegate = self;
pickerTypesCarburants.dataSource = self;
Чтобы ответить на ваш второй вопрос, клавиатура будет скрываться только при нажатии клавиши возврата с помощью реализованного вами метода textFieldShouldReturn. В UITextField также должен быть установлен свой делегат (я предполагаю, что вы делаете это в IB, поскольку он не указан в вашем файле .m). Чтобы клавиатура скрывалась, как только вы нажимаете UITextField, вам нужно изменить свой метод pickerTypeCarburantsShow:
-(IBAction)pickerTypeCarburantsShow{
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:0.5];
CGAffineTransform transform=CGAffineTransformMakeTranslation(0, 240);
pickerViewTypesCarburants.transform=transform;
[self.view addSubview:pickerViewTypesCarburants];
[UIView commitAnimations];
[typeCarburantTextField resignFirstResponder];
}
Это гарантирует, что клавиатура будет скрыта немедленно (а не при нажатии кнопки возврата). Опять же, я хотел бы спросить, почему вы хотели бы, чтобы UIPickerView отображался при нажатии на UITextField, поскольку это, вероятно, противоречит рекомендациям по пользовательскому интерфейсу.
Комментарии:
1. Привет, спасибо за ваш ответ, однако я сделал так, как вы сказали, и ничего не изменилось : ( , и на ваш вопрос я бы сказал, что требования моего приложения обязывают меня поступить подобным образом
2. Привет, вы могли бы попробовать реализовать
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
делегат для UITextField и вернуть NO — это должно помешать текстовому полю когда-либо стать редактируемым и, таким образом, предотвратить появление клавиатуры в первую очередь. В качестве альтернативы попробуйте установить для свойства userInteractionEnabled значение NO.