简体   繁体   English

调整自定义UIDatePicker的代码

[英]Adjusting Code for Custom UIDatePicker

So i found this amazing code on here that pops up a UIDatePicker. 所以我在这里发现了这个惊人的代码,它弹出一个UIDatePicker。 (kudos to Matthias Bauch) I'd like to customize it with a custom picker wheel, but the code is at a complexity level that I'm not sure how to go about switching to a UIPicker and how to fill said picker with my arrays. (对Matthias Bauch表示敬意)我想使用自定义选择器轮对其进行自定义,但是代码处于复杂程度,因此我不确定如何切换到UIPicker以及如何用我的数组填充所说的选择器。

Here is the original code: 这是原始代码:

- (void)changeDate:(UIDatePicker *)sender {
    NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
  [dateFormat setDateFormat:@"cccc, MMM d, hh:mm aa"];
  NSString *formattedVersion = [dateFormat stringFromDate:sender.date];
  NSLog(@"%@",formattedVersion);

}

- (void)removeViews:(id)object {
 [[self.view viewWithTag:9] removeFromSuperview];
 [[self.view viewWithTag:10] removeFromSuperview];
 [[self.view viewWithTag:11] removeFromSuperview];
}

- (void)dismissDatePicker:(id)sender {
 CGRect toolbarTargetFrame = CGRectMake(0, self.view.bounds.size.height, 320, 44);
 CGRect datePickerTargetFrame = CGRectMake(0, self.view.bounds.size.height+44, 320, 216);
 [UIView beginAnimations:@"MoveOut" context:nil];
 [self.view viewWithTag:9].alpha = 0;
 [self.view viewWithTag:10].frame = datePickerTargetFrame;
 [self.view viewWithTag:11].frame = toolbarTargetFrame;
 [UIView setAnimationDelegate:self];
 [UIView setAnimationDidStopSelector:@selector(removeViews:)];
 [UIView commitAnimations];
}

- (IBAction)callDP:(id)sender {
 if ([self.view viewWithTag:9]) {
  return;
 }
 CGRect toolbarTargetFrame = CGRectMake(0, self.view.bounds.size.height-216-44, 320, 44);
 CGRect datePickerTargetFrame = CGRectMake(0, self.view.bounds.size.height-216, 320, 216);

 UIView *darkView = [[[UIView alloc] initWithFrame:self.view.bounds] autorelease];
 darkView.alpha = 0;
 darkView.backgroundColor = [UIColor blackColor];
 darkView.tag = 9;
 UITapGestureRecognizer *tapGesture = [[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(dismissDatePicker:)] autorelease];
 [darkView addGestureRecognizer:tapGesture];
 [self.view addSubview:darkView];

 UIDatePicker *datePicker = [[[UIDatePicker alloc] initWithFrame:CGRectMake(0, self.view.bounds.size.height+44, 320, 216)] autorelease];
 datePicker.tag = 10;
 [datePicker addTarget:self action:@selector(changeDate:) forControlEvents:UIControlEventValueChanged];
 [self.view addSubview:datePicker];

 UIToolbar *toolBar = [[[UIToolbar alloc] initWithFrame:CGRectMake(0, self.view.bounds.size.height, 320, 44)] autorelease];
 toolBar.tag = 11;
 toolBar.barStyle = UIBarStyleBlackTranslucent;
 UIBarButtonItem *spacer = [[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil] autorelease];
 UIBarButtonItem *doneButton = [[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(dismissDatePicker:)] autorelease];
 [toolBar setItems:[NSArray arrayWithObjects:spacer, doneButton, nil]];
 [self.view addSubview:toolBar];

 [UIView beginAnimations:@"MoveIn" context:nil];
 toolBar.frame = toolbarTargetFrame;
 datePicker.frame = datePickerTargetFrame;
 darkView.alpha = 0.5;
 [UIView commitAnimations];
}

I'd like to add my UIPicker with these values in the picker wheel: 我想将我的UIPicker与这些值一起添加到拾取轮中:

  Days=[[NSArray alloc] initWithObjects: @"Today", @"Tomorrow", nil];
  Hours = [[NSArray alloc] initWithObjects:@"1", @"2", @"3", @"4", @"5", @"6", @"7", @"8", @"9", @"10", @"11", @"12", nil];
  Minutes=[[NSArray alloc] initWithObjects:@"05", @"10", @"15", @"20", @"25", @"30", @"35", @"40", @"45", @"50", @"55", nil];

Any help/guidance would be really appreciated!! 任何帮助/指导将不胜感激!

Thanks, Mat 谢谢,马特

You will need to use a UIPickerView instead of a UIDatePicker . 您将需要使用UIPickerView而不是UIDatePicker You will then need to supply the proper delegate methods to provide the data for it. 然后,您将需要提供适当的委托方法来为其提供数据。

First create an array to hold items that will be available in the picker: 首先创建一个数组,以保存在选择器中可用的项目:

NSMutableArray *arrayColors = [[NSMutableArray alloc] init];
[arrayColors addObject:@"Red"];
[arrayColors addObject:@"Orange"];

Implement data source methods for picker: 为选择器实现数据源方法:

- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)thePickerView {
    return 1;
}

- (NSInteger)pickerView:(UIPickerView *)thePickerView numberOfRowsInComponent:(NSInteger)component {

return [arrayColors count];
}

- (NSString *)pickerView:(UIPickerView *)thePickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component {
return [arrayColors objectAtIndex:row];
}

And the delegate method to get what item the user selected: 然后使用委托方法来获取用户选择的项目:

- (void)pickerView:(UIPickerView *)thePickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component {

NSLog(@"Selected Color: %@. Index of selected color: %i", [arrayColors objectAtIndex:row], row);
}

Here is the documentation . 这是文档

Update 更新资料

To create a UIPickerView programmatically make sure it looks something like this: 要以编程方式创建UIPickerView,请确保它看起来像这样:

//Make sure our class knows we have picker delegate/data source methods in it
@interface myViewController : UIViewController <UIPickerViewDataSource, UIPickerViewDelegate>

The creation 创作

//Picker creation
UIPickerView *myPickerView = [[UIPickerView alloc] initWithFrame:CGRectMake(0, 200, 320, 200)];
myPickerView.delegate = self;
myPickerView.showsSelectionIndicator = YES;
[self.view addSubview:myPickerView];

A handy delegate method 方便的委托方法

// tell the picker the width of each row for a given component. no necessary but helpful if need be
- (CGFloat)pickerView:(UIPickerView *)pickerView widthForComponent:(NSInteger)component {
 int sectionWidth = 300;

 return sectionWidth;
}

Adding off random's comment. 添加随机的评论。 If you would like to use this picker to replace your keyboard when pressing a UITextField to input information to the textfield here's how. 如果您想在按下UITextField向文本字段输入信息时使用此选择器替换键盘,请按以下步骤操作。

[<Your UI text field> setInputView:<your picker view>];

example: 例:

NSMutableArray *pickerData = [[NSMutableArray alloc]initWithObjects:@"",@"1", @"2", @"3", @"4", @"5", @"6", @"7", nil];
UIPickerView *myPickerView = [[UIPickerView alloc]init];
myPickerView.delegate = self;
myPickerView.dataSource = self;
myPickerView.showsSelectionIndicator = YES;
[self.myTexfield setInputView:myPickerView];

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM