在UIPickerview上显示完成button

我在viewDidLoad方法中编写了下面的代码:

 categoryPickerView=[[UIPickerView alloc]init]; categoryPickerView.alpha = 0; [self.view addSubview:categoryPickerView]; categoryPickerView.delegate=self; categoryPickerView.tag=1; 

并调用这个方法来隐藏select器视图

 - (IBAction)hidePickerView:(id)sender { [UIView beginAnimations:nil context:nil]; [UIView setAnimationDuration:0.6]; CGAffineTransform transfrom = CGAffineTransformMakeTranslation(0, 200); categoryPickerView.transform = transfrom; categoryPickerView.alpha = categoryPickerView.alpha * (-1) + 1; [UIView commitAnimations]; } 

我的问题是,我想显示一个select器视图上的“完成”button,select器视图应隐藏在button单击。

你可以使用这个代码,

 UIToolbar *toolBar= [[UIToolbar alloc] initWithFrame:CGRectMake(0,0,320,44)]; [toolBar setBarStyle:UIBarStyleBlackOpaque]; UIBarButtonItem *barButtonDone = [[UIBarButtonItem alloc] initWithTitle:@"Done" style:UIBarButtonItemStyleBordered target:self action:@selector(changeDateFromLabel:)]; toolBar.items = @[barButtonDone]; barButtonDone.tintColor=[UIColor blackColor]; [pickerView addSubview:toolBar]; //(or)pickerView.inputAccessoryView = toolBar; 

并为changeDateFromLabel:设置button操作方法changeDateFromLabel:

 -(void)changeDateFromLabel:(id)sender { [[your UI Element] resignFirstResponder]; } 

您可以创build视图,并添加工具栏“完成”button和UIPickerView作为子视图

 - (void)createInputView { CGFloat screenWidth = [UIScreen mainScreen].bounds.size.width; UIToolbar *toolBar= [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, screenWidth, 44)]; [toolBar setBarStyle:UIBarStyleDefault]; UIBarButtonItem *flex = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:self action:nil]; UIBarButtonItem *barButtonDone = [[UIBarButtonItem alloc] initWithTitle:@"Done" style:UIBarButtonItemStyleBordered target:self action:@selector(doneClicked)]; toolBar.items = @[flex, barButtonDone]; barButtonDone.tintColor = [UIColor blackColor]; UIPickerView *picker = [[UIPickerView alloc] initWithFrame:CGRectMake(0, toolBar.frame.size.height, screenWidth, 200)]; picker.delegate = self; picker.dataSource = self; picker.showsSelectionIndicator = YES; UIView *inputView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, screenWidth, toolBar.frame.size.height + picker.frame.size.height)]; inputView.backgroundColor = [UIColor clearColor]; [inputView addSubview:picker]; [inputView addSubview:toolBar]; textField.inputView = inputView; } - (void)doneClicked { [textField resignFirstResponder]; } 

您需要使用UIToolbar作为附件视图:请尝试以下操作:

 #pragma mark - PickerView for Location Selection - (UIPickerView *)locationsPicker { if ( locationsPicker == nil ) { locationsPicker = [[UIPickerView alloc] init]; locationsPicker.delegate = self; locationsPicker.dataSource = self; locationsPicker.showsSelectionIndicator = YES; } return locationsPicker; } - (UIToolbar *)accessoryView { if ( accessoryView == nil ) { accessoryView = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, 320, 44)]; UIBarButtonItem *doneButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem: UIBarButtonSystemItemDone target:self action:@selector(onLocationSelection)]; [accessoryView setItems:[NSArray arrayWithObject:doneButton]]; } return accessoryView; } - (void)onLocationSelection { NSInteger row = [self.locationsPicker selectedRowInComponent:0]; if ( [Location isFirstResponder] ) { NSLog(@"%@", [listOfLocations objectAtIndex:row]); [Location resignFirstResponder]; } } 

具有“完成”button的UIToolbar应该添加到视图的inputAccessoryView中, 成为第一个响应者 。 由于UIView类从UIResponderinheritance,所以任何视图都可能包含一个inputViewinputAccessoryView 。 因此,可以使用UIResponder的键盘显示/隐藏animation附带的默认animation行为来代替手动执行animation。

  1. 子类UIView并覆盖inputViewinputAccessoryView属性,并使它们为readwrite 。 在这个例子中,我将inheritance一个UITableViewCell

     // FirstResponderTableViewCell.h @interface FirstResponderTableViewCell : UITableViewCell @property (readwrite, strong, nonatomic) UIView *inputView; @property (readwrite, strong, nonatomic) UIView *inputAccessoryView; @end 
  2. 在您的子类的实现中重写canBecomeFirstResponder

     // FirstResponderTableViewCell.m - (BOOL)canBecomeFirstResponder { return YES; } 
  3. 在您的视图控制器中,创build并分配选取器视图和input附件工具栏

     // MyViewController.m - (void)viewDidLoad { [super viewDidLoad]; UIPickerView *pickerView = [[UIPickerView alloc] init]; UIToolbar *accessoryToolbar = [UIToolbar alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 44)]; // Configure toolbar ..... // note: myFirstResponderTableViewCell is an IBOutlet to a static cell in storyboard of type FirstResponderTableViewCell self.myFirstResponderTableViewCell.inputView = pickerView; self.myFirstResponderTableViewCell.inputAccessoryView = accessoryToolbar; } 
  4. 不要忘记在需要时将第一响应者分配给视图(例如,inside – tableView:didSelectRowAtIndexPath:

     [self.myFirstResponderTableViewCell becomeFirstResponder]; 

希望这可以帮助。

参考: http : //blog.swierczynski.net/2010/12/how-to-create-uipickerview-with-toolbar-above-it-in-ios/

尝试这个。

 UIPickerView *cityPicker = [[UIPickerView alloc] initWithFrame:CGRectZero]; cityPicker.delegate = self; cityPicker.dataSource = self; [cityPicker setShowsSelectionIndicator:YES]; txtText.inputView = cityPicker; // Create done button in UIPickerView UIToolbar* mypickerToolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, 320, 56)]; mypickerToolbar.barStyle = UIBarStyleBlackOpaque; [mypickerToolbar sizeToFit]; NSMutableArray *barItems = [[NSMutableArray alloc] init]; UIBarButtonItem *flexSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:self action:nil]; [barItems addObject:flexSpace]; UIBarButtonItem *doneBtn = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(pickerDoneClicked)]; [barItems addObject:doneBtn]; [mypickerToolbar setItems:barItems animated:YES]; txtText.inputAccessoryView = mypickerToolbar; // set the toolbar as input accessory view for uitextfield, not the pickerview. 

http://technopote.com/how-to-make-multiple-uipickerview-in-a-single-view/

复制粘贴解决scheme!

这适用于iOS 10(也可能是其他版本)我在9/4/2017写了这个代码。

我需要结合其他答案来获得我想要的,这是一个Cancelbutton, Donebutton,和一个select器视图,将显示/隐藏在一个button的水龙头。 忽略这个事实,我的屏幕截图只有一个select器中的项目..我只有一个项目在我的数组中。 我已经testing了多个项目,它工作正常。

在这里输入图像说明

免责声明! 我已经testing和使用这个代码。 我在我的例子中概括了名字,所以我提前道歉,如果我错过了,他们的财产名称不排队。

为了让一个pickerView出现在button上,你需要在你的视图控制器的任何地方创build一个dummyTextField(types为UITextField这是因为UIPickerView的devise是为了与UITextFields一起工作。select器,你的button水龙头需要调用dummyTextField的becomeFirstResponderresignFirstResponder方法(示例如下)

步骤1

创build一个自定义的数据源类。 MyObj是您希望在拾取器中显示项目的类。

在.h中:

 #import <UIKit/UIKit.h> @class myObj; @interface PickerDataSource : NSObject <UIPickerViewDataSource, UIPickerViewDelegate> @property (nonatomic, strong) MyObj *selectedObject; @end 

在.m中:

 #import "PickerDataSource.h" #import "MyObj.h" @implementation PickerDataSource - (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component { self.selectedObject = mySourceArray[row]; } - (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component { return mySourceArray.count; } - (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView { return 1; } - (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component { return ((MyObj *)mySourceArray[row]).myTitle; } - (CGFloat)pickerView:(UIPickerView *)pickerView widthForComponent:(NSInteger)component { int sectionWidth = 300; return sectionWidth; } @end 

第二步在你的视图控制器中,导入自定义的数据源,委托和设置属性:(你必须包含文本字段委托!)

 #import "PickerDataSource.h" @interface MyViewController () <UIPickerViewDelegate, UITextFieldDelegate> @property (strong, nonatomic) PickerDataSource *pickerDataSource; @property (strong, nonatomic) UIPickerView *picker; @property (strong, nonatomic) UITextField *dummyTextField; @end 

第三步

在你的viewDidLoad ,调用[self setupPicker]; (接下来你会创build这个方法)

第四步

创buildsetupPicker

 - (void)setupPicker { // init custom picker data source self.pickerDataSource = [PickerDataSource new]; // init custom picker self.picker = [UIPickerView new]; // set the picker's dataSource and delegate to be your custom data source self.picker.dataSource = self.pickerDataSource; self.picker.delegate = self.pickerDataSource; self.picker.showsSelectionIndicator = YES; // next step is to write this configure method getting called here [self configurePickerSubviews]; // lastly, add the dummyTextField to your view. [self.view addSubview:self.dummyTextField]; } 

第五步

创buildconfigurePickerSubviews

 - (void)configurePickerSubviews { // A UIPickerView must be added as an inputView to a UITextField in order to be displayed on button tap // So you need to create a dummyTextField to do so. self.dummyTextField = [UITextField new]; // Create a toolbar to add a done button UIToolbar *toolBar= [[UIToolbar alloc] initWithFrame:CGRectMake(0,0,[UIScreen mainScreen].bounds.size.width,44)]; [toolBar setBarStyle:UIBarStyleDefault]; UIBarButtonItem *done = [[UIBarButtonItem alloc] initWithTitle:@"Done" style:UIBarButtonItemStylePlain target:self action:@selector(locationPressed)]; // Create a flex space so that done button will be right aligned UIBarButtonItem *flex = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:self action:nil]; UIBarButtonItem *cancel = [[UIBarButtonItem alloc] initWithTitle:@"Cancel" style:UIBarButtonItemStylePlain target:self action:@selector(dismissPicker)]; toolBar.items = @[cancel, flex, done]; done.tintColor = [UIColor blackColor]; [self.picker addSubview:toolBar]; // Create an input view to add picker + done button as subviews UIView *inputView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, self.picker.frame.size.height + 44)]; [self.picker setFrame:CGRectMake(0, 0, inputView.frame.size.width, inputView.frame.size.height)]; inputView.backgroundColor = [UIColor clearColor]; [inputView addSubview:self.picker]; [inputView addSubview:toolBar]; // Set custom inputView as container for picker view self.dummyTextField.inputView = inputView; // Hiding the textfield will hide the picker [self.dummyTextField setHidden:YES]; } 

第六步

configurationPickerDataSource以便它从您的源数组中提取要显示的数据。

第七步

点击Run

  #import "ViewController.h" @interface ViewController ()<UIPickerViewDelegate> { UIPickerView *myPickerView; NSArray *namesArray ; } @end @implementation ViewController -(void)viewDidLoad { [super viewDidLoad]; namesArray=[[NSArray alloc]initWithObjects:@"a",@"b", nil]; [self popoverWithInformation]; } -(void)popoverWithInformation { UIToolbar *pickerToolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, 320, 44)]; pickerToolbar.barStyle = UIBarStyleBlackOpaque; [pickerToolbar sizeToFit]; NSMutableArray *barItems = [[NSMutableArray alloc] init]; UIBarButtonItem *cancelBtn = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:self action:@selector(pickerCancel:)]; [barItems addObject:cancelBtn]; UIBarButtonItem *flexSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:nil action:nil]; [barItems addObject:flexSpace]; UIBarButtonItem *doneBtn = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(pickerDone:)]; [barItems addObject:doneBtn]; [pickerToolbar setItems:barItems animated:YES]; myPickerView = [[UIPickerView alloc] init]; myPickerView.delegate = self; myPickerView.showsSelectionIndicator = YES; CGRect pickerRect = myPickerView.bounds; myPickerView.bounds = pickerRect; myPickerView.frame = CGRectMake(0, 44, 320, 216); UIView* popoverView = [[UIView alloc] initWithFrame:CGRectMake(0, 44, 320, 300)]; popoverView.backgroundColor = [UIColor whiteColor]; [popoverView addSubview:myPickerView]; [popoverView addSubview:pickerToolbar]; [self.view addSubview:popoverView]; } -(void)pickerView:(UIPickerView *)pickerView didSelectRow: (NSInteger)row inComponent:(NSInteger)component { } // tell the picker how many rows are available for a given component -(NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component { return namesArray.count; } // tell the picker how many components it will have -(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView { return 1; } // tell the picker the title for a given component -(NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component { return namesArray[row]; } // tell the picker the width of each row for a given component -(CGFloat)pickerView:(UIPickerView *)pickerView widthForComponent:(NSInteger)component { int sectionWidth = 300; return sectionWidth; } -(void)pickerDone:(id)sender { } -(void)pickerCancel:(id)sender { }