【发布时间】:2011-08-16 11:10:15
【问题描述】:
这是我到目前为止所做的截图:
所以我想要做的是当你选择“选择一个名字”文本字段时,我需要一个 Picker 来显示,输入 @“Jack”。
【问题讨论】:
-
设置
并将文本字段与界面生成器中的委托连接起来,对于 UIPiickrView..
标签: ios objective-c uitextfield uipickerview
这是我到目前为止所做的截图:
所以我想要做的是当你选择“选择一个名字”文本字段时,我需要一个 Picker 来显示,输入 @“Jack”。
【问题讨论】:
标签: ios objective-c uitextfield uipickerview
从 iOS 3.2 开始,UITextField 支持 inputView 属性来分配自定义视图以用作键盘,这提供了一种显示 UIPickerView 的方法:
您可以使用UITextField 的inputView 属性,可能与inputAccessoryView 属性结合使用。您将 pickerView 分配给 inputView 属性,并为关闭选择器,将完成按钮分配给 inputAccessoryView 属性。
UIPickerView *myPickerView = [[UIPickerView alloc] init];
//myPickerView configuration here...
myTextField.inputView = myPickerView;
这样。这不会为您提供直接关闭视图的方法,因为您的 UIPickerView 没有返回按钮,这就是为什么我建议使用 inputAccessoryView 属性来显示带有完成按钮的工具栏(该栏只是为了美观,您不妨只使用UIButton 对象):
UIToolbar *myToolbar = [[UIToolbar alloc] initWithFrame:
CGRectMake(0,0, 320, 44)]; //should code with variables to support view resizing
UIBarButtonItem *doneButton =
[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone
target:self action:@selector(inputAccessoryViewDidFinish)];
//using default text field delegate method here, here you could call
//myTextField.resignFirstResponder to dismiss the views
[myToolbar setItems:[NSArray arrayWithObject: doneButton] animated:NO];
myTextField.inputAccessoryView = myToolbar;
【讨论】:
我使用它并发现它比添加子视图和动画UIPicker 干净得多
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField {
responder = textField;
if ([textField isEqual:self.txtBirthday]) {
UIDatePicker *datepicker = [[UIDatePicker alloc] initWithFrame:CGRectZero];
[datepicker setDatePickerMode:UIDatePickerModeDate];
textField.inputView = datepicker;
}
return YES;
}
【讨论】:
它会为你工作..我已经编辑了它。为此你必须为文本字段设置委托。并在 NIb 文件中创建一个 UIPIckrView。
- (BOOL) textFieldShouldBeginEditing:(UITextView *)textView
{
pickrView.frame = CGRectMake(0, 500, pickrView.frame.size.width, pickrView.frame.size.height);
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:.50];
[UIView setAnimationDelegate:self];
pickrView.frame = CGRectMake(0, 200, pickrView.frame.size.width, pickrView.frame.size.height);
[self.view addSubview:pickrView];
[UIView commitAnimations];
return NO;
}
【讨论】:
好吧,您可以依靠UITextFieldDelegate 来处理这种功能。
里面
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
是您设置当前UITextField 的文本以及初始化和显示UIPickerView 的位置。
重要提示:
您可能还想遵守UIPickerViewDelegate。
HTH
【讨论】:
斯威夫特:
internal var textFieldHandlerToolBar: UIToolbar = {
let tb = UIToolbar.init(frame: CGRect.init(origin: .zero, size: CGSize.init(width: UIScreen.main.bounds.width, height: 44.0)))
let doneBarButton = UIBarButtonItem.init(title: "Done", style: UIBarButtonItemStyle.done, target: self, action: #selector(actionDonePickerSelection))
tb.setItems([doneBarButton], animated: false)
return tb
}()
internal var pickerView: UIPickerView = {
let pv = UIPickerView.init()
return pv
}()
@objc internal func actionDonePickerSelection() {
textField.resignFirstResponder()
}
override func viewDidLoad() {
super.viewDidLoad()
self.pickerView.delegate = self
self.pickerView.datasource = self
}
像这样使用它:
textField.inputAccessoryView = self.textFieldHandlerToolBar
textField.inputView = self.pickerView
【讨论】:
您可以做的是,在UITextField 上创建一个具有自定义类型的UIButton。两者具有相同的大小。轻触按钮即可显示UIPickerView。
【讨论】:
我的博客中有代码和所有内容,可以准确地做到这一点。但在下面,我列出了基本概念。
基本上,该解决方案涉及在 github 上名为 ActionSheetPicker 的开源项目,并在 UITextFieldDelegate 上实现函数 textFieldShouldBeginEditing。您可以在那里关闭键盘并提供 UIPickerView 。这里列出了基本代码:
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField {
// We are now showing the UIPickerViewer instead
// Close the keypad if it is showing
[self.superview endEditing:YES];
// Function to show the picker view
[self showPickerViewer :array :pickerTitle];
// Return no so that no cursor is shown in the text box
return NO;
}
【讨论】:
ViewController.h
@interface ChangeCurrencyVC : UIViewController <UIPickerViewDataSource, UIPickerViewDelegate>
{
NSArray *availableCurreniesArray;
}
@property (weak, nonatomic) IBOutlet UITextField *chooseCurrencyTxtFldRef;
ViewController.m
- (void)viewDidLoad {
[super viewDidLoad];
availableCurreniesArray = @[@"Indian Rupee", @"US Dollar", @"European Union Euro", @"Canadian Dollar", @"Australian Dollar", @"Singapore Dollar", @"British Pound", @"Japanese Yen"];
// Do any additional setup after loading the view.
[self pickerview:self];
}
#pragma mark - picker view Custom Method
-(void)pickerview:(id)sender{
UIPickerView *pickerView = [[UIPickerView alloc] initWithFrame:CGRectMake(0, 0, 0, 0)];
pickerView.showsSelectionIndicator = YES;
pickerView.dataSource = self;
pickerView.delegate = self;
// set change the inputView (default is keyboard) to UIPickerView
self.chooseCurrencyTxtFldRef.inputView = pickerView;
// add a toolbar with Cancel & Done button
UIToolbar *toolBar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, 320, 44)];
toolBar.barStyle = UIBarStyleBlackOpaque;
UIBarButtonItem *doneButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(doneTouched:)];
UIBarButtonItem *cancelButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:self action:@selector(cancelTouched:)];
// the middle button is to make the Done button align to right
[toolBar setItems:[NSArray arrayWithObjects:cancelButton, [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil], doneButton, nil]];
self.chooseCurrencyTxtFldRef.inputAccessoryView = toolBar;
}
#pragma mark - doneTouched
- (void)cancelTouched:(UIBarButtonItem *)sender{
// hide the picker view
[self.chooseCurrencyTxtFldRef resignFirstResponder];
}
#pragma mark - doneTouched
- (void)doneTouched:(UIBarButtonItem *)sender{
// hide the picker view
[self.chooseCurrencyTxtFldRef resignFirstResponder];
// perform some action
}
#pragma mark - The Picker Challenge
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView {
return 1;
}
-(NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component{
return [availableCurreniesArray count];
}
- (nullable NSString *)pickerView:(UIPickerView *)pickerView titleForRow: (NSInteger)row forComponent:(NSInteger)component{
return availableCurreniesArray[row];
}
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component {
self.chooseCurrencyTxtFldRef.text = availableCurreniesArray[row];
}
【讨论】: