ios - uipickerview swift 4 example
mostrar el botón hecho en UIPickerview (7)
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 de selector y la vista de selector debe ocultarse al hacer clic en el botón.
Debe utilizar la barra de herramientas de la UIT como la vista de accesorios: intente 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];
}
}
La UIToolbar
de la UIToolbar
con el botón "Hecho" debe agregarse a la inputAccessoryView
de inputAccessoryView
de 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
. Entonces, en lugar de realizar las animaciones manualmente mediante programación, puede utilizar el comportamiento de animación predeterminado que viene con la animación de mostrar / ocultar del teclado del UIResponder.
UIView
unaUIView
y anule las propiedadesinputView
yinputAccessoryView
y haga que sereadwrite
areadwrite
. En este ejemplo, voy a subclasificar unUITableViewCell
.// FirstResponderTableViewCell.h @interface FirstResponderTableViewCell : UITableViewCell @property (readwrite, strong, nonatomic) UIView *inputView; @property (readwrite, strong, nonatomic) UIView *inputAccessoryView; @end
Reemplace
canBecomeFirstResponder
en la implementación de su subclase.// FirstResponderTableViewCell.m - (BOOL)canBecomeFirstResponder { return YES; }
En su controlador de vista, cree y asigne la vista del selector y la barra de herramientas de accesorios de entrada
// 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; }
No olvide asignar el primer respondedor a la vista cuando sea necesario (por ejemplo, en -
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/
Puede crear una vista y agregar una barra de herramientas con el botón "Listo" 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];
}
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];
}
¡Una solución que se pueda copiar!
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 de selector que se mostraría / ocultaría en el toque de un botón. Ignorar 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 artículos, funciona bien.
¡Renuncia! He probado y usado este código. Generalicé los nombres en mi ejemplo, así que me disculpo de antemano si me olvido de uno y los nombres de las propiedades no coinciden.
Para tener un pickerView que aparece en el toque de un botón, necesita crear un dummyTextField (del tipo UITextField
en cualquier parte de su controlador de vista . Esto se debe a que los UIPickerView
están diseñados para trabajar con UITextFields. Para imitar la visualización y la ocultación de El selector, sus pulsaciones de botón deben llamar a los métodos becomeFirstResponder
y resignFirstResponder
(los ejemplos están a continuación)
Paso uno
Crear una clase de origen de datos personalizada. MyObj es la clase para la que desea que aparezcan elementos en el selector.
En .h:
#import <UIKit/UIKit.h>
@class myObj;
@interface PickerDataSource : NSObject <UIPickerViewDataSource, UIPickerViewDelegate>
@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 el origen de datos personalizado, el delegado y establezca las propiedades: (¡ Debe incluir el delegado del campo de texto!)
#import "PickerDataSource.h"
@interface MyViewController () <UIPickerViewDelegate, UITextFieldDelegate>
@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];
(Usted 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
modo que PickerDataSource
los datos que desea mostrar de su matriz de origen.
Paso 7
Haga clic en 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
{
}