UIPickerView 编程示例?
Posted
技术标签:
【中文标题】UIPickerView 编程示例?【英文标题】:UIPickerView programmatic example? 【发布时间】:2011-07-09 17:12:43 【问题描述】:如何在不使用 Interface Builder 的情况下以编程方式在视图中设置 UIPickerView?也无法理解如何使用 UIPickerView 的委托部分。
【问题讨论】:
这是一个在 ios 10 ***.com/a/46047257/3634990987654321@ 【参考方案1】:以编程方式添加 UIPickerView:
- (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;
【讨论】:
如何将 3 个不同对象的列表添加到选取器中的 3 个组件中?如何检索每个组件选择的每个项目?谢谢 我给了你一点,因为它为其他人的链接添加了更多信息......谢谢【参考方案2】:这在 iOS 8 中不起作用
使用 DataSource 以编程方式创建 UIPickerView
.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
.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];
参考:http://gabriel-tips.blogspot.in/2011/04/uipickerview-add-it-programmatically_04.html
【讨论】:
【参考方案3】: 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];
【讨论】:
【参考方案4】:这是我最近创建的课程。它在 swift 4.1.2 中。 只需写一行,您的选择器就会显示出来。
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
您可以在任何地方使用它,请参见下面的示例。
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)
【讨论】:
要下载文件,请点击此链接:github.com/indrajitv/Custompickerview/blob/master/…以上是关于UIPickerView 编程示例?的主要内容,如果未能解决你的问题,请参考以下文章