ios 在 UIPickerview 上显示完成按钮
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/20883388/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
display done button on UIPickerview
提问by iOS i'm loving It.
I have written the following code in the viewDidLoad
method:
我在viewDidLoad
方法中编写了以下代码:
categoryPickerView=[[UIPickerView alloc]init];
categoryPickerView.alpha = 0;
[self.view addSubview:categoryPickerView];
categoryPickerView.delegate=self;
categoryPickerView.tag=1;
and called this method to hide picker view
并调用此方法来隐藏选择器视图
- (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];
}
My problem is that I want to display a "Done" button on a picker view and the picker view should hide on button click.
我的问题是我想在选择器视图上显示“完成”按钮,并且选择器视图应该在单击按钮时隐藏。
回答by sathiamoorthy
You can use this code,
您可以使用此代码,
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;
and set button action method for changeDateFromLabel:
并设置按钮动作方法 changeDateFromLabel:
-(void)changeDateFromLabel:(id)sender
{
[[your UI Element] resignFirstResponder];
}
回答by ananas
You can create view and add toolbar with "Done" button and UIPickerView as subviews
您可以使用“完成”按钮和 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];
}
回答by jungledev
Copy-pasteable solution!
可复制粘贴的解决方案!
This works in iOS 10 (and probably other versions too) I wrote this code on 9/4/2017.
这适用于 iOS 10(可能还有其他版本)我在 2017 年 9 月 4 日编写了此代码。
I needed to combine other answers to get what I wanted, which was a Cancel
button, Done
button, and a picker view that would show/hide on the tap of a button. Ignore the fact that my screenshot only has one item in the picker.. I only have one item in my array. I've tested multiple items, it works fine.
我需要结合其他答案来得到我想要的,这是一个Cancel
按钮、Done
按钮和一个选择器视图,可以在点击按钮时显示/隐藏。忽略我的屏幕截图在选择器中只有一项的事实。我的数组中只有一项。我测试了多个项目,它工作正常。
Disclaimer! I have tested and used this code. I generalized the names in my example, so I apologize in advance if I missed one and they property names don't line up.
免责声明!我已经测试并使用了这段代码。我在我的例子中概括了名称,所以如果我错过了一个并且它们的属性名称不对齐,我提前道歉。
In order to have a pickerView that appears on the tap of a button, you need to create a dummyTextField (of type UITextField
anywhere in your view controller. This is because UIPickerView
's are designed to work with UITextFields. To mimic showing and hiding of the picker, your button taps need to call the dummyTextField's becomeFirstResponder
and resignFirstResponder
methods. (examples are below)
为了让一个 pickerView 出现在点击按钮时,您需要创建一个 dummyTextField(类型UITextField
在您的视图控制器中的任何位置。这是因为UIPickerView
's 旨在与 UITextFields 一起使用。模仿选择器的显示和隐藏,您的按钮点击需要调用 dummyTextFieldbecomeFirstResponder
和resignFirstResponder
方法。(示例如下)
Step one
步骤1
Create a custom data source class. MyObj is the class you want to have items show up in the picker for.
创建自定义数据源类。MyObj 是您希望在其选择器中显示项目的类。
In .h:
在.h:
#import <UIKit/UIKit.h>
@class myObj;
@interface PickerDataSource : NSObject <UIPickerViewDataSource, UIPickerViewDelegate>
@property (nonatomic, strong) MyObj *selectedObject;
@end
In .m:
在.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
Step twoIn your view controller, import custom data source, delegate, and set properties: (You mustinclude the text field delegate!)
第二步在你的视图控制器中,导入自定义数据源、委托和设置属性:(你必须包括文本字段委托!)
#import "PickerDataSource.h"
@interface MyViewController () <UIPickerViewDelegate, UITextFieldDelegate>
@property (strong, nonatomic) PickerDataSource *pickerDataSource;
@property (strong, nonatomic) UIPickerView *picker;
@property (strong, nonatomic) UITextField *dummyTextField;
@end
Step three
第三步
In your viewDidLoad
, call [self setupPicker];
(you'll create this method next)
在您的viewDidLoad
, 调用[self setupPicker];
(接下来您将创建此方法)
Step four
第四步
Create setupPicker
创建 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];
}
Step five
第五步
Create configurePickerSubviews
创建 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];
}
Step six
第六步
Configure the PickerDataSource
so that it is fetching the data you want to display from your source array.
配置PickerDataSource
以便它从源数组中获取要显示的数据。
Step 7
第 7 步
Click Run
!
点击Run
!
回答by Kumar KL
You need to use the UIToolbar as the accessory view: Try with this:
您需要使用 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];
}
}
回答by ken
The UIToolbar
with the 'Done' button should be added to the inputAccessoryView
of the view that becomes first responder. As the UIView
class inherits from UIResponder
, any view can potentially contain an inputView
and inputAccessoryView
. So instead of manually performing the animations programmatically, you could use the default animation behaviour that comes with the UIResponder's keyboard show/hide animation.
在UIToolbar
与“完成”按钮应该被添加到inputAccessoryView
该视图的变第一响应。由于UIView
该类继承自UIResponder
,因此任何视图都可能包含inputView
和inputAccessoryView
。因此,您可以使用 UIResponder 的键盘显示/隐藏动画随附的默认动画行为,而不是以编程方式手动执行动画。
Subclass a
UIView
and override theinputView
andinputAccessoryView
properties and make themreadwrite
. In this example, I will subclass aUITableViewCell
.// FirstResponderTableViewCell.h @interface FirstResponderTableViewCell : UITableViewCell @property (readwrite, strong, nonatomic) UIView *inputView; @property (readwrite, strong, nonatomic) UIView *inputAccessoryView; @end
Override
canBecomeFirstResponder
in your subclass' implementation.// FirstResponderTableViewCell.m - (BOOL)canBecomeFirstResponder { return YES; }
In your view controller, create and assign the picker view and input accessory toolbar
// 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; }
Don't forget to assign first responder to the view when required (e.g. inside -
tableView:didSelectRowAtIndexPath:
)[self.myFirstResponderTableViewCell becomeFirstResponder];
子类 a
UIView
并覆盖inputView
和inputAccessoryView
属性并使它们成为readwrite
。在这个例子中,我将子类化 aUITableViewCell
。// FirstResponderTableViewCell.h @interface FirstResponderTableViewCell : UITableViewCell @property (readwrite, strong, nonatomic) UIView *inputView; @property (readwrite, strong, nonatomic) UIView *inputAccessoryView; @end
覆盖
canBecomeFirstResponder
子类的实现。// FirstResponderTableViewCell.m - (BOOL)canBecomeFirstResponder { return YES; }
在您的视图控制器中,创建并分配选择器视图和输入附件工具栏
// 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; }
不要忘记在需要时将第一响应者分配给视图(例如在内部 -
tableView:didSelectRowAtIndexPath:
)[self.myFirstResponderTableViewCell becomeFirstResponder];
Hope this helps.
希望这可以帮助。
Reference: http://blog.swierczynski.net/2010/12/how-to-create-uipickerview-with-toolbar-above-it-in-ios/
参考:http: //blog.swierczynski.net/2010/12/how-to-create-uipickerview-with-toolbar-above-it-in-ios/
回答by Marku
Try this.
尝试这个。
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/
http://technopote.com/how-to-make-multiple-uipickerview-in-a-single-view/
回答by Charan Giri
#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
{
}