mostrar el botón hecho en UIPickerview

He escrito el siguiente código en el método viewDidLoad :

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

y llamó a este método para ocultar la vista del selector

 - (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]; } 

Mi problema es que quiero mostrar un botón “Listo” en una vista del selector y la vista del selector debe ocultarse al hacer clic en el botón.

Puedes usar este código,

 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; 

y establecer el método de acción del botón para changeDateFromLabel:

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

Puede crear vista y agregar barra de herramientas con el botón “Hecho” y UIPickerView como subvistas

 - (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]; } 

Debes usar la UIToolbar como la vista de accesorios: prueba con esto:

 #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]; } } 

¡Solución para copiar y pegar!

Esto funciona en iOS 10 (y probablemente también en otras versiones). Escribí este código el 9/4/2017.

Necesitaba combinar otras respuestas para obtener lo que quería, que era un botón Cancel , un botón Done y una vista del selector que se mostraría / ocultaría con solo tocar un botón. Ignore el hecho de que mi captura de pantalla solo tiene un elemento en el selector. Solo tengo un elemento en mi matriz. He probado varios elementos, funciona bien.

enter image description here

¡Renuncia! He probado y usado este código. Generalicé los nombres en mi ejemplo, así que me disculpo por adelantado si omito uno y los nombres de las propiedades no se alinean.

Para tener un PickerView que aparece al toque de un botón, necesita crear un dummyTextField (del tipo UITextField en cualquier lugar de su controlador de vista . Esto se debe a que los UIPickerView están diseñados para trabajar con UITextFields. Para imitar la presentación y el ocultamiento de el selector, los botones de su botón necesitan llamar a los métodos becomeFirstResponder y resignFirstResponder . (ejemplos abajo)

Paso uno

Crea una clase de fuente de datos personalizada. MyObj es la clase en la que desea que aparezcan los elementos en el selector.

En .h:

 #import  @class myObj; @interface PickerDataSource : NSObject  @property (nonatomic, strong) MyObj *selectedObject; @end 

En 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 

Paso dos En su controlador de vista, importe origen de datos personalizado, delegue y establezca las propiedades: (¡ Debe incluir el delegado del campo de texto!)

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

Paso tres

En su viewDidLoad , llame a [self setupPicker]; (Creará este método a continuación)

Paso cuatro

Crear setupPicker

 - (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]; } 

Paso cinco

Crear configurePickerSubviews

 - (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]; } 

Paso seis

Configure PickerDataSource para que PickerDataSource los datos que desea mostrar desde su matriz de origen.

Paso 7

Haga clic en Run !

La UIToolbar con el botón ‘Listo’ debe agregarse a la vista inputAccessoryView de la vista que se convierte en el primer respondedor . Como la clase UIView hereda de UIResponder , cualquier vista puede contener un inputView y inputAccessoryView . Por lo tanto, en lugar de realizar manualmente las animaciones mediante progtwigción, puede usar el comportamiento de animación predeterminado que viene con el teclado UIResponder show / hide animation.

  1. Subclass a UIView y anule las propiedades inputView y inputAccessoryView y haga que readwrite . En este ejemplo, voy a subclasificar una UITableViewCell .

     // FirstResponderTableViewCell.h @interface FirstResponderTableViewCell : UITableViewCell @property (readwrite, strong, nonatomic) UIView *inputView; @property (readwrite, strong, nonatomic) UIView *inputAccessoryView; @end 
  2. Anular canBecomeFirstResponder en la implementación de su subclase.

     // FirstResponderTableViewCell.m - (BOOL)canBecomeFirstResponder { return YES; } 
  3. En su controlador de vista, cree y asigne la vista del selector e ingrese la barra de herramientas accesoria

     // 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. No se olvide de asignar el primer respondedor a la vista cuando sea necesario (p. Ej. tableView:didSelectRowAtIndexPath:tableView:didSelectRowAtIndexPath:

     [self.myFirstResponderTableViewCell becomeFirstResponder]; 

Espero que esto ayude.

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

Prueba esto.

 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/

  #import "ViewController.h" @interface ViewController () { 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 { }