with uipicker pickerview example done iphone objective-c xcode cocoa-touch

iphone - example - ¿Ejemplo de programación UIPickerView?



uipickerview example swift (4)

¿Cómo configuro de manera programática el UIPickerView en una vista sin usar Interface Builder? También tiene problemas para entender cómo trabajar con las partes delegadas de UIPickerView.


Aquí está la clase que he creado recientemente. Es rápido 4.1.2. Solo escribe una línea y tu selector estará en exhibición.

import UIKit class CustomPickerView:NSObject,UIPickerViewDelegate,UIPickerViewDataSource{ //Theme colors var itemTextColor = UIColor.black var backgroundColor = UIColor.orange.withAlphaComponent(0.5) var toolBarColor = UIColor.blue var font = UIFont.systemFont(ofSize: 16) private static var shared:CustomPickerView! var bottomAnchorOfPickerView:NSLayoutConstraint! var heightOfPickerView:CGFloat = UIDevice.current.userInterfaceIdiom == .pad ? 160 : 120 var heightOfToolbar:CGFloat = UIDevice.current.userInterfaceIdiom == .pad ? 50 : 40 var dataSource:(items:[String]?,itemIds:[String]?) typealias CompletionBlock = (_ item:String?,_ id:String?) -> Void var didSelectCompletion:CompletionBlock? var doneBottonCompletion:CompletionBlock? var cancelBottonCompletion:CompletionBlock? lazy var pickerView:UIPickerView={ let pv = UIPickerView() pv.translatesAutoresizingMaskIntoConstraints = false pv.delegate = self pv.dataSource = self pv.showsSelectionIndicator = true pv.backgroundColor = self.backgroundColor return pv }() lazy var disablerView:UIView={ let view = UIView() view.backgroundColor = UIColor.black.withAlphaComponent(0.1) view.translatesAutoresizingMaskIntoConstraints = false view.alpha = 0 return view }() lazy var tooBar:UIView={ let view = UIView() view.backgroundColor = self.toolBarColor view.translatesAutoresizingMaskIntoConstraints = false view.addSubview(buttonDone) buttonDone.rightAnchor.constraint(equalTo: view.rightAnchor, constant: 0).isActive = true buttonDone.topAnchor.constraint(equalTo: view.topAnchor, constant: 0).isActive = true buttonDone.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: 0).isActive = true buttonDone.widthAnchor.constraint(equalToConstant: 65).isActive = true view.addSubview(buttonCancel) buttonCancel.leftAnchor.constraint(equalTo: view.leftAnchor, constant: 0).isActive = true buttonCancel.topAnchor.constraint(equalTo: view.topAnchor, constant: 0).isActive = true buttonCancel.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: 0).isActive = true buttonCancel.widthAnchor.constraint(equalToConstant: 65).isActive = true return view }() lazy var buttonDone:UIButton={ let button = UIButton(type: .system) button.setTitle("Done", for: .normal) button.tintColor = self.itemTextColor button.titleLabel?.font = self.font button.translatesAutoresizingMaskIntoConstraints = false button.titleLabel?.adjustsFontSizeToFitWidth = true button.addTarget(self, action: #selector(self.buttonDoneClicked), for: .touchUpInside) return button }() lazy var buttonCancel:UIButton={ let button = UIButton(type: .system) button.setTitle("Cancel", for: .normal) button.tintColor = self.itemTextColor button.titleLabel?.font = self.font button.translatesAutoresizingMaskIntoConstraints = false button.titleLabel?.adjustsFontSizeToFitWidth = true button.addTarget(self, action: #selector(self.buttonCancelClicked), for: .touchUpInside) return button }() static func show(items:[String],itemIds:[String]? = nil,selectedValue:String? = nil,doneBottonCompletion:CompletionBlock?,didSelectCompletion:CompletionBlock?,cancelBottonCompletion:CompletionBlock?){ if CustomPickerView.shared == nil{ shared = CustomPickerView() }else{ return } if let appDelegate = UIApplication.shared.delegate as? AppDelegate,let keyWindow = appDelegate.window { shared.cancelBottonCompletion = cancelBottonCompletion shared.didSelectCompletion = didSelectCompletion shared.doneBottonCompletion = doneBottonCompletion shared.dataSource.items = items if let idsVal = itemIds,items.count == idsVal.count{ //ids can not be less or more than items shared?.dataSource.itemIds = itemIds } shared?.heightOfPickerView += shared.heightOfToolbar keyWindow.addSubview(shared.disablerView) shared.disablerView.leftAnchor.constraint(equalTo: keyWindow.leftAnchor, constant: 0).isActive = true shared.disablerView.rightAnchor.constraint(equalTo: keyWindow.rightAnchor, constant: 0).isActive = true shared.disablerView.topAnchor.constraint(equalTo: keyWindow.topAnchor, constant: 0).isActive = true shared.disablerView.bottomAnchor.constraint(equalTo: keyWindow.bottomAnchor, constant: 0).isActive = true shared.disablerView.addSubview(shared.pickerView) shared.pickerView.leftAnchor.constraint(equalTo: shared.disablerView.leftAnchor, constant: 0).isActive = true shared.pickerView.rightAnchor.constraint(equalTo: shared.disablerView.rightAnchor, constant: 0).isActive = true shared.pickerView.heightAnchor.constraint(equalToConstant: shared.heightOfPickerView).isActive = true shared.bottomAnchorOfPickerView = shared.pickerView.topAnchor.constraint(equalTo: shared.disablerView.bottomAnchor, constant: 0) shared.bottomAnchorOfPickerView.isActive = true shared.disablerView.addSubview(shared.tooBar) shared.tooBar.heightAnchor.constraint(equalToConstant: shared.heightOfToolbar).isActive = true shared.tooBar.leftAnchor.constraint(equalTo: shared.disablerView.leftAnchor, constant: 0).isActive = true shared.tooBar.rightAnchor.constraint(equalTo: shared.disablerView.rightAnchor, constant: 0).isActive = true shared.tooBar.bottomAnchor.constraint(equalTo: shared.pickerView.topAnchor, constant: 0).isActive = true keyWindow.layoutIfNeeded() if let selectedVal = selectedValue{ for (index,itemName) in items.enumerated(){ if itemName.lowercased() == selectedVal.lowercased(){ shared.pickerView.selectRow(index, inComponent: 0, animated: false) break } } } shared.bottomAnchorOfPickerView.constant = -shared.heightOfPickerView UIView.animate(withDuration: 0.5, delay: 0, usingSpringWithDamping: 1, initialSpringVelocity: 1, options: .curveEaseOut, animations: { keyWindow.layoutIfNeeded() shared.disablerView.alpha = 1 }) { (bool) in } } } //MARK: Picker datasource delegates func numberOfComponents(in pickerView: UIPickerView) -> Int { return 1 } func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { if let count = dataSource.items?.count{ return count } return 0 } //MARK: Picker delegates func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String?{ if let names = dataSource.items{ return names[row] } return nil } func pickerView(_ pickerView: UIPickerView, attributedTitleForRow row: Int, forComponent component: Int) -> NSAttributedString? { if let names = dataSource.items{ let item = names[row] return NSAttributedString(string: item, attributes: [NSAttributedStringKey.foregroundColor : itemTextColor,NSAttributedStringKey.font : font]) } return nil } func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { var itemName:String? var id:String? if let names = dataSource.items{ itemName = names[row] } if let ids = dataSource.itemIds{ id = ids[row] } self.didSelectCompletion?(itemName, id) } @objc func buttonDoneClicked(){ self.hidePicker(handler: doneBottonCompletion) } @objc func buttonCancelClicked(){ self.hidePicker(handler: cancelBottonCompletion) } func hidePicker(handler:CompletionBlock?){ var itemName:String? var id:String? let row = self.pickerView.selectedRow(inComponent: 0) if let names = dataSource.items{ itemName = names[row] } if let ids = dataSource.itemIds{ id = ids[row] } handler?(itemName, id) bottomAnchorOfPickerView.constant = self.heightOfPickerView UIView.animate(withDuration: 0.7, delay: 0, usingSpringWithDamping: 1, initialSpringVelocity: 1, options: .curveEaseOut, animations: { self.disablerView.window!.layoutIfNeeded() self.disablerView.alpha = 0 }) { (bool) in self.disablerView.removeFromSuperview() CustomPickerView.shared = nil } } }

Puedes usarlo en cualquier lugar, ver ejemplo abajo.

CustomPickerView.show(items: ["item1","item2","item3"],itemIds: ["id1","id2","id3"],selectedValue:"item3", doneBottonCompletion: { (item, index) in print("done",item,index) }, didSelectCompletion: { (item, index) in print("selection",item,index) }) { (item, index) in print("cancelled",item,index) }


Para agregar UIPickerView mediante programación:

- (void)pickerView:(UIPickerView *)pV didSelectRow:(NSInteger)row inComponent:(NSInteger)component { if(component == 1) selectedRowPicker1 = row; else if(component == 2) selectedRowPicker2 = row; else selectedRowPicker3 = row; } - (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView { return 3; } - (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component { if(component == 1) return [list1 count]; else if(component == 2) return [list2 count]; else return [list3 count]; } - (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component { if(component == 1) val1 = [list1 objectAtIndex:row]; else if(component == 2) val2 = [list2 objectAtIndex:row]; else val3 = [list3 objectAtIndex:row]; return strTemp; }


Esto no funcionará en iOS 8

Crear UIPickerView programáticamente con DataSource

archivo .h

@interface PickerViewTestAppViewController : UIViewController<UIPickerViewDelegate, UIPickerViewDataSource> { UIActionSheet *pickerViewPopup; UIPickerView *categoryPickerView; UIPickerView *pickerView; NSMutableArray *dataArray; } @property (nonatomic, retain) UIActionSheet *pickerViewPopup; @property (nonatomic, retain) UIPickerView *categoryPickerView; @property (nonatomic, retain) NSMutableArray *dataArray; @end

archivo .m

@implementation PickerViewTestAppViewController @synthesize pickerViewPopup,categoryPickerView; @synthesize dataArray; - (void)viewDidLoad { [super viewDidLoad]; // Init the data array. dataArray = [[NSMutableArray alloc] init]; // Add some data for demo purposes. [dataArray addObject:@"One"]; [dataArray addObject:@"Two"]; [dataArray addObject:@"Three"]; [dataArray addObject:@"Four"]; [dataArray addObject:@"Five"]; pickerViewPopup = [[UIActionSheet alloc] initWithTitle:nil delegate:self cancelButtonTitle:nil destructiveButtonTitle:nil otherButtonTitles:nil]; categoryPickerView = [[UIPickerView alloc] initWithFrame:CGRectMake(0, 44, 0, 0)]; [categoryPickerView setDataSource: self]; [categoryPickerView setDelegate: self]; categoryPickerView.showsSelectionIndicator = YES; UIToolbar *pickerToolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, 320, 44)]; pickerToolbar.barStyle = UIBarStyleBlackOpaque; [pickerToolbar sizeToFit]; UIBarButtonItem *flexSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:self action:nil]; UIBarButtonItem *doneBtn = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(categoryDoneButtonPressed)]; UIBarButtonItem *cancelBtn = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:self action:@selector(categoryCancelButtonPressed)]; [pickerToolbar setItems:@[cancelBtn, flexSpace, doneBtn] animated:YES]; [pickerViewPopup addSubview:pickerToolbar]; [pickerViewPopup addSubview:categoryPickerView]; [pickerViewPopup showInView:self.view]; [pickerViewPopup setBounds:CGRectMake(0,0,320, 464)]; } - (void)pickerView:(UIPickerView *)pickerView didSelectRow: (NSInteger)row inComponent:(NSInteger)component { // Handle the selection NSLog(@"%@",[dataArray objectAtIndex:row]); selectedCategory = [NSString stringWithFormat:@"%@",[dataArray objectAtIndex:row]]; } // tell the picker how many rows are available for a given component - (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component { return [dataArray 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 [dataArray objectAtIndex: 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)categoryDoneButtonPressed{ categoryLable.text = selectedCategory; [pickerViewPopup dismissWithClickedButtonIndex:1 animated:YES]; } -(void)categoryCancelButtonPressed{ [pickerViewPopup dismissWithClickedButtonIndex:1 animated:YES]; }

Ref: http://gabriel-tips.blogspot.in/2011/04/uipickerview-add-it-programmatically_04.html


NSInteger selectCourse=[_coursePicker selectedRowInComponent:0]; NSInteger selectSem=[_coursePicker selectedRowInComponent:1]; NSString *whatCourse=[Course objectAtIndex:selectCourse]; NSString *whatSem=[Sem objectAtIndex:selectSem]; NSString *courses=[[NSString alloc]initWithFormat:@"Course : %@ - %@",whatCourse,whatSem]; [self.selectedCours setTitle:courses forState:UIControlStateNormal];