display done button on UIPickerview - ios

I have written the following code in the viewDidLoad method:
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.

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:
-(void)changeDateFromLabel:(id)sender
{
[[your UI Element] resignFirstResponder];
}

You can create view and add toolbar with "Done" button and UIPickerView as subviews
- (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];
}

You need to use the UIToolbar as the accessory view:
Try with this:
#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];
}
}

Copy-pasteable solution!
This works in iOS 10 (and probably other versions too) I wrote this code on 9/4/2017.
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.
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)
Step one
Create a custom data source class. MyObj is the class you want to have items show up in the picker for.
In .h:
#import <UIKit/UIKit.h>
#class myObj;
#interface PickerDataSource : NSObject <UIPickerViewDataSource, UIPickerViewDelegate>
#property (nonatomic, strong) MyObj *selectedObject;
#end
In .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 two In your view controller, import custom data source, delegate, and set properties: (You must include 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)
Step four
Create 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
- (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.
Step 7
Click Run!

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.
Subclass a UIView and override the inputView and inputAccessoryView properties and make them readwrite. In this example, I will subclass a UITableViewCell.
// 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];
Hope this helps.
Reference: http://blog.swierczynski.net/2010/12/how-to-create-uipickerview-with-toolbar-above-it-in-ios/

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/

#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
{
}

In Swift 5 try this,
func setToolBar() {
let toolBar = UIToolbar(frame: CGRect(x: 0, y: 0, width: view.frame.width, height: 44))
toolBar.barStyle = UIBarStyle.default
let doneButton = UIBarButtonItem(title: "Done", style: UIBarButtonItem.Style.done, target: self, action: #selector(self.donePicker))
toolBar.setItems([doneButton],animated: false)
toolBar.isUserInteractionEnabled = true
doneButton.tintColor = UIColor.black
picker.addSubview(toolBar)
}
#objc func donePicker() {
// hide keypad
}

Related

Default value in textfield using picker view

I am new to iOS i need to display objectAtIndex(0) in textfield using uipickerview .while run the app textfield empty after selection in picker view only value can displayed in textfield i need initially textfield not be empty.
viewdidload code:
pktStatePicker .delegate = self;
pktStatePicker .dataSource = self;
[ pktStatePicker setShowsSelectionIndicator:YES];
txtText.inputView = pktStatePicker ;
// 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;
picker view delegates:
- (void) pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{
NSLog([arrmsg1 objectAtIndex:row]);
txtText.text = (NSString *)[arrMsg objectAtIndex:row];
}
set like on your ViewDidLoad, but ensure once your arrMsg.count!=0
- (void)viewDidLoad
{
[super viewDidLoad];
txtText.text = (NSString *)[arrMsg objectAtIndex:0];
}
choice-2
or when you append the data in arrMsg after that call like
if (arrMsg.count >0)
{
txtText.text = (NSString *)[arrMsg objectAtIndex:0];
}
there after continue your work asuseual

How do you hide a UIPickerview on button tap programmatically?

i have a uipickerivew in uitablview prototype cell, i want to hide only when done button pressed. please help me.
here is my code for how i create uipickeriview and done button.
self.pickerView = [[UIPickerView alloc] initWithFrame:(CGRect){{0, 0}, 330, 200}];
self.pickerView.delegate = self;
self.pickerView.dataSource = self;
self.pickerView.center = (CGPoint){160, 640};
self.pickerView.hidden = YES;
self.pickerView.backgroundColor =[UIColor whiteColor];
[self.view addSubview:self.pickerView];
UIToolbar *toolBar= [[UIToolbar alloc] initWithFrame:CGRectMake(0,0,320,44)];
[toolBar setBarStyle:UIBarStyleBlackOpaque];
UIBarButtonItem *flex = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:self action:nil];
UIBarButtonItem *barButtonDone = [[UIBarButtonItem alloc] initWithTitle:#"Done"
style:UIBarButtonItemStyleBordered
target:self
action:#selector(pickerDoneClicked)];
toolBar.items = #[barButtonDone];
toolBar.items = #[flex, barButtonDone];
barButtonDone.tintColor = [UIColor lightGrayColor];
[_pickerView addSubview:toolBar];
-(void) pickerDoneClicked {
[_pickerView resignFirstResponder];
}
It is better to rather than create and remove each time, create your pickerview once in view did load and then in your cell do:
[_pickerView becomeFirstResponder];
(to show it like a keyboard animated in).
You can then create a pickerDoneClicked method (that is called when Done is tapped) to call resignFirstResponder on your pickerview (to animate it away):
-(void) pickerDoneClicked {
[_pickerView resignFirstResponder];
}
just add below IBAction method and call removefromsuperview method,
-(void)pickerDoneClicked{
[self.pickerView removeFromSuperview];}
As you are already adding again everytime, you can directly remove it from superview and adding again.
After selecting a value using picker view you can implement this method.Add a toolbar with done button and give action to done button
- (IBAction)doneClicked:(id)sender {
[yourTextfield resignFirstResponder];
}
this method is used in the case , when selecting a value to the textfield with picker as input.
- (void)viewDidLoad {
self.pickerView = [[UIPickerView alloc] initWithFrame:CGRectMake(0, 0, 330, 200)];
self.pickerView.delegate = self;
self.pickerView.dataSource = self;
self.pickerView.backgroundColor =[UIColor whiteColor];
[self.view addSubview:self.pickerView];
UIToolbar *toolBar= [[UIToolbar alloc] initWithFrame:CGRectMake(0,0,320,44)];
[toolBar setBarStyle:UIBarStyleBlackOpaque];
UIBarButtonItem *barButtonDone = [[UIBarButtonItem alloc] initWithTitle:#"Done"
style: UIBarButtonItemStylePlain
target:self
action:#selector(pickerDoneClicked:)];
UIBarButtonItem *flex = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:self action:nil];
toolBar.items = #[flex, barButtonDone];
barButtonDone.tintColor = [UIColor lightGrayColor];
[self.view addSubview:toolBar];
}
-(IBAction)pickerDoneClicked:(id)sender
{
pickerView.hidden = YES;
}
Inside the didiSelectRow method add this line of code:
self.view.endEditing(true)

How to add done button on uidatepicker?

UIDatePicker *datePicker = [[UIDatePicker alloc]init];
[datePicker setDate:[NSDate date]];
[datePicker addTarget:self action:#selector(updateTextField:) forControlEvents:UIControlEventValueChanged];
[txt_time setInputView:datePicker];
UIBarButtonItem *barButton=[[UIBarButtonItem alloc]initWithTitle:#"Done" style:UIBarButtonItemStyleBordered target:self action:#selector(addORDeleteRows)];
How to add done button on top of the uidatepicker when I press on textfield then uidatepicker will show after entering the date done button also show. After clicking on done button uidatepicker should be hidden.
Alloc a view add datepicker at bottom to the view and toolbar on the top of datepicker to the view.
Add barbuttons to the toolbar.
//First declare all the property and set the delegate and datasource in .h like this
#interface RegistrationView : UIViewController <UIPickerViewDataSource,UIPickerViewDelegate,UIActionSheetDelegate>
{
UIPickerView *picker;
UIToolbar *toolbarPicker;
UIActionSheet *actionPicker;
}
#property (strong,nonatomic) UIPickerView *picker;
#property (strong,nonatomic) UIToolbar *toolbarPicker;
#property (strong,nonatomic) UIActionSheet *actionPicker;
//and synthesis in .m file
#synthesize picker,actionPicker,toolbarPicker;
// in View did load method put call the setting method for picker
[self pickerSetting];
// set picker,action sheet and toolbar through This method
-(void) pickerSetting
{
toolbarPicker = [[UIToolbar alloc] initWithFrame:CGRectMake(0,0,self.view.bounds.size.width,44)];
if (!g_IS_IOS_6)
{
toolbarPicker.barTintColor = [UIColor colorWithRed:72.0/255.0 green:197.0/255.0 blue:87.0/255.0 alpha:1.0];
}
toolbarPicker.frame=CGRectMake(0,0,320,44);
actionPicker = [[UIActionSheet alloc] initWithTitle:nil delegate:nil cancelButtonTitle:nil destructiveButtonTitle:nil otherButtonTitles:nil];
actionPicker.frame = CGRectMake(0, 234, 320, 256);
[actionPicker setActionSheetStyle:UIActionSheetStyleDefault];
actionPicker.delegate = self;
UIImage *imgbtnConvert = [UIImage imageNamed:#"info_button.png"];//Done btn.png
UIButton *btnConvert = [UIButton buttonWithType:UIButtonTypeCustom];
btnConvert.bounds = CGRectMake(200, 0, 93,31);
[btnConvert setTitle:#"Done" forState:UIControlStateNormal];
[btnConvert setTintColor:[UIColor whiteColor]];
[btnConvert setBackgroundImage:imgbtnConvert forState:UIControlStateNormal];
[btnConvert addTarget:self action:#selector(pickerDoneClick) forControlEvents:UIControlEventTouchUpInside];
UIBarButtonItem *barButtonItemConvert = [[UIBarButtonItem alloc] initWithCustomView:btnConvert];
UIBarButtonItem *flexConvert = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
UIImage *imageConvert = [UIImage imageNamed:#"info_button.png"];//cancel png
UIButton *buttonConvert = [UIButton buttonWithType:UIButtonTypeCustom];
buttonConvert.bounds = CGRectMake( 0, 0, 93,31);
[buttonConvert setTitle:#"Cancel" forState:UIControlStateNormal]; //set title
[buttonConvert setTintColor:[UIColor whiteColor]]; //font color
[buttonConvert setBackgroundImage:imageConvert forState:UIControlStateNormal]; //set background image
[buttonConvert addTarget:self action:#selector(pickerCancelClick) forControlEvents:UIControlEventTouchUpInside];
UIBarButtonItem *barCancelButtonItemConvert = [[UIBarButtonItem alloc] initWithCustomView:buttonConvert];
NSArray *itemsConvert = [[NSArray alloc] initWithObjects:barCancelButtonItemConvert, flexConvert, barButtonItemConvert, nil];
[toolbarPicker setItems:itemsConvert];
[actionPicker addSubview:toolbarPicker];
picker = [[UIPickerView alloc] initWithFrame:CGRectMake(0, 44, 320, 216)];
picker.delegate = self;
picker.dataSource = self;
picker.showsSelectionIndicator = YES;
picker.backgroundColor= [UIColor whiteColor];
[actionPicker addSubview:picker];
}
// and add two mehtod for picker done button and cancel button click .
-(void) pickerDoneClick
{
// picker done button click put here your code ..
[actionPickerSearchCar dismissWithClickedButtonIndex:0 animated:YES];
}
-(void) pickerCancelClick {
// Cancel button click
[actionPickerSearchCar dismissWithClickedButtonIndex:0 animated:YES];
}
// and put the delegate and data source method
#pragma mark -
#pragma mark UIPickerView Delegate Datasource Method
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView {
return 1;
}
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component {
// return yourarr.count;
}
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
// return yourarr[row];
}
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{
// selectedfiles =yourarr[row];
}
// call this method for allocation picker .
[self pickerSetting]
// and show picker using this (put This in button action method)
-(IBAction)showPicker:(id)sender
{
[actionPickerSearchCar showInView:self.view];
[actionPickerSearchCar setBounds:CGRectMake(0, 0, 320, 465)];
}
I hope , it's helpful for you . Thank you.
I think you might really want to use the inputAccessoryView property of UITextField. Just put an UIToolbar there with your UIBarButtonItem and use the target action to call [txt_time resignFirstResponder].

UIPicker subview not recognizing input

I am trying to dismiss a UIPickerView using a toolbar similar to the inputAccessoryView on keyboards.
I am using the same UIToolbar for both my text field and my picker, the textfield will dismiss properly, but the picker doesn't even recognize my touch on the button.
This is the code I am using to create the toolbar:
UIToolbar *tipToolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, 320, 50)];
tipToolbar.barStyle = UIBarStyleDefault;
UIBarButtonItem *donebtn = [[UIBarButtonItem alloc] initWithTitle:#"Done" style:UIBarButtonItemStyleDone target:self action:#selector(resignResponder:)];
tipToolbar.items = [NSArray arrayWithObjects:
[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil],
donebtn, nil
];
[tipToolbar sizeToFit];
_outlet_txt_ipaddr.inputAccessoryView = tipToolbar;
[_outlet_picker addSubview:tipToolbar];
And this is the action that will dismiss the keyboard or the picker:
- (IBAction)resignResponder:(id)sender{
[_outlet_txt_ipaddr resignFirstResponder];
[_outlet_picker resignFirstResponder];
}
The toolbar appears on the picker view, but my tap on the done button isn't even showing the animation let alone call the resignResonder action.
for picker view [_outlet_picker resignFirstResponder]; will not work.
you need to implement the delegate for picker view.
try this code
UIToolbar *tipToolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, 320, 50)];
tipToolbar.barStyle = UIBarStyleDefault;
UIBarButtonItem *donebtn = [[UIBarButtonItem alloc] initWithTitle:#"Done" style:UIBarButtonItemStyleDone target:self action:#selector(resignResponder:)];
tipToolbar.items = [NSArray arrayWithObjects:
[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil],
donebtn, nil
];
[tipToolbar sizeToFit];
_outlet_txt_ipaddr.inputAccessoryView = tipToolbar;
_outlet_picker.delegate=self;
_outlet_picker.dataSource=self;
_outlet_picker.showsSelectionIndicator=YES;
[self.view addSubview:outlet_picker];
-(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
{
return 1;
}
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component;
{
return [pickerValueAry count];
}
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component;
{
NSMutableArray *ary = [[NSMutableArray alloc] initWithArray:pickerValueAry];
id str=[ary objectAtIndex:row];
return str;
}
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{
NSLog(#"selectedRowInPicker >> %d",row);
}
you can dismiss the picker view on row select.

Custom UITextField not showing

I am trying to create a custom UITextField that shows a date picker instead of a keyboard. I already change the textfields in my storyboard to use DateTextField custom class, however, still the keyboard is being shown instead of the date picker. Note that the textfields are inside a UITableviewCell.
Also, i am not sure if this is the correct way of creating the toolbar:
self.datePickerToolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, self.superview.bounds.size.width, 44)];
#interface DateTextField : UITextField
#property (strong, nonatomic) UIDatePicker *datePicker;
#property (strong, nonatomic) UIToolbar *datePickerToolbar;
#end
#implementation DateTextField
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
self.datePicker = [[UIDatePicker alloc] init];
self.datePicker.datePickerMode = UIDatePickerModeDate;
self.datePickerToolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, self.superview.bounds.size.width, 44)];
[self.datePickerToolbar setBarStyle:UIBarStyleBlackTranslucent];
UIBarButtonItem *extraSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
UIBarButtonItem *doneButton = [[UIBarButtonItem alloc] initWithTitle:#"Done" style:UIBarButtonItemStyleDone target:self action:#selector(setDatePickerValue:)];
[self.datePickerToolbar setItems:[[NSArray alloc] initWithObjects:extraSpace, doneButton, nil]];
self.inputView = self.datePicker;
self.inputAccessoryView = self.datePickerToolbar;
}
return self;
}
#end
If you add the textfields in storyboard/xib the init method will not be called.
Try with awakeFromNib. Move all the code in the init method to awakeFromNib
- (void)awakeFromNib
{
[super awakeFromNib];
self.datePicker = [[UIDatePicker alloc] init];
self.datePicker.datePickerMode = UIDatePickerModeDate;
self.datePickerToolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, self.superview.bounds.size.width, 44)];
[self.datePickerToolbar setBarStyle:UIBarStyleBlackTranslucent];
UIBarButtonItem *extraSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
UIBarButtonItem *doneButton = [[UIBarButtonItem alloc] initWithTitle:#"Done" style:UIBarButtonItemStyleDone target:self action:#selector(setDatePickerValue:)];
[self.datePickerToolbar setItems:[[NSArray alloc] initWithObjects:extraSpace, doneButton, nil]];
self.inputView = self.datePicker;
self.inputAccessoryView = self.datePickerToolbar;
}
Instead of using a UITextField, why don't you use a UIButton. It saves a whole lot of time in the future. In this case, the UIButton acts like a UILabel with a tap gesture recognizer.
However, if you need to use UITextField, do this:
- (void)textFieldDidBeginEditing:(UITextField *)textField
{
if ([textField isEqual:yourTextField])
{
// Present the picker here first
...
// And then...
return NO;
}
return YES;
}
Oh and also, do not initialize any UIView subclass properties inside any -initWith... methods. That will trigger a mismatched view lifecycle. Initialize/access these properties inside -viewDidLoad.

Resources