如何像键盘一样呈现选择器视图?

发布于 2024-11-14 11:06:18 字数 267 浏览 2 评论 0原文

我希望当我按下按钮(就像键盘一样)时显示 UIPickerView,然后在用户点击屏幕上的任意位置时消失。我该怎么做?谢谢。

更多背景信息:我在 UITableViewCell 中有一个名为 Months 的 UITextField。现在对我来说最好的选择是在那里放置一个 UIPikcerView ,用户可以更轻松地选择月份,而不必输入它(这是更好的方法)。但 UIPickerView 在 UITableViewCell 中看起来真的很难看,更不用说我无法改变它巨大的尺寸。那么这种情况我该怎么办呢?

I want a UIPickerView to show up when I press a button (just like keyboard) and then go away when user taps anywhere on the screen. How can I do this? Thanks.

A bit more background: I have a UITextField called months in UITableViewCell. Now the best option for me is to put a UIPikcerView there and it will be easier for the user to just chose the month rather than having to type it out (and it's the better way). But UIPickerView looks really ugly in a UITableViewCell, not to mention I can't change it's gigantic size. So what should I do in this case?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

千纸鹤 2024-11-21 11:06:18

这就是您应该如何将 UIPickerView 用于 UITableView 中的文本字段。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier] autorelease];
    cell.selectionStyle= UITableViewCellSelectionStyleNone;
    UITextField *textField = [[UITextField alloc]initWithFrame:CGRectMake(110, 10, 185, 30)];
    textField.clearsOnBeginEditing = NO;
    textField.textAlignment = UITextAlignmentRight;
    textField.delegate = self;
    [cell.contentView addSubview:textField];
    //textField.returnKeyType = UIReturnKeyDone;
    cell.textLabel.backgroundColor = [UIColor clearColor];
    cell.detailTextLabel.backgroundColor = [UIColor clearColor];

        // if you want a UIPickerView for first row... then do the following //
        // Here.. packSizePickerView is an object of UIPickerView

   if (indexPath.row == 1)
  {
    textField.tag=0;
    textField.delegate= self;
    packSizePickerView.delegate = self;
    packSizePickerView = [[UIPickerView alloc] init];
    packSizePickerView.autoresizingMask=UIViewAutoresizingFlexibleWidth;
    packSizePickerView.showsSelectionIndicator=YES;
    textField.inputView  = packSizePickerView;
    }

    // if you want to select date / months  in row 2, go for UIDatePickerView //

    if (indexPath.row == 1)
    {
        textField.tag = 1;
        UIDatePicker *datePicker = [[UIDatePicker alloc] init];
        datePicker.datePickerMode = UIDatePickerModeDate;
       [datePicker addTarget:self action:@selector(datePickerValueChangedd:) forControlEvents:UIControlEventValueChanged];
        datePicker.tag = indexPath.row;
        textField.delegate= self;
        textField.inputView = datePicker;
        [datePicker release];

    }

}

// Configure the cell...

NSInteger row = [indexPath row];
cell.textLabel.text = [myArray objectAtIndex:row];

return cell;

现在

对于 datePickerValueChangedd

- (void)datePickerValueChangedd:(UIDatePicker*) datePicker{
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(100, 50, 68, 68)];
NSDateFormatter *df = [[NSDateFormatter alloc] init];
df.dateStyle = NSDateFormatterMediumStyle;
label.text = [NSString stringWithFormat:@"%@",[df stringFromDate:datePicker.date]];

    NSLog(@"I am inside the datePickerValueChanged   - - %@", label.text);
[df release];
    globalValue1 = label.text;

   // use a global variable to copy the value from the pickerView. //
   }    

在 textFieldDidEndEditing:

-(void) textFieldDidEndEditing:(UITextField *)textField {
if (textField.tag ==0)
   [textField setText: globalValue0];

if (textField.tag ==1)
   [textField setText: globalValue1];

}

并退出 UIDatePicker,将 UIView 设置为 UIControl 并

resignFirstResponder

This is how you should use UIPickerView for a textField in a UITableView.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier] autorelease];
    cell.selectionStyle= UITableViewCellSelectionStyleNone;
    UITextField *textField = [[UITextField alloc]initWithFrame:CGRectMake(110, 10, 185, 30)];
    textField.clearsOnBeginEditing = NO;
    textField.textAlignment = UITextAlignmentRight;
    textField.delegate = self;
    [cell.contentView addSubview:textField];
    //textField.returnKeyType = UIReturnKeyDone;
    cell.textLabel.backgroundColor = [UIColor clearColor];
    cell.detailTextLabel.backgroundColor = [UIColor clearColor];

        // if you want a UIPickerView for first row... then do the following //
        // Here.. packSizePickerView is an object of UIPickerView

   if (indexPath.row == 1)
  {
    textField.tag=0;
    textField.delegate= self;
    packSizePickerView.delegate = self;
    packSizePickerView = [[UIPickerView alloc] init];
    packSizePickerView.autoresizingMask=UIViewAutoresizingFlexibleWidth;
    packSizePickerView.showsSelectionIndicator=YES;
    textField.inputView  = packSizePickerView;
    }

    // if you want to select date / months  in row 2, go for UIDatePickerView //

    if (indexPath.row == 1)
    {
        textField.tag = 1;
        UIDatePicker *datePicker = [[UIDatePicker alloc] init];
        datePicker.datePickerMode = UIDatePickerModeDate;
       [datePicker addTarget:self action:@selector(datePickerValueChangedd:) forControlEvents:UIControlEventValueChanged];
        datePicker.tag = indexPath.row;
        textField.delegate= self;
        textField.inputView = datePicker;
        [datePicker release];

    }

}

// Configure the cell...

NSInteger row = [indexPath row];
cell.textLabel.text = [myArray objectAtIndex:row];

return cell;

}

And for datePickerValueChangedd

- (void)datePickerValueChangedd:(UIDatePicker*) datePicker{
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(100, 50, 68, 68)];
NSDateFormatter *df = [[NSDateFormatter alloc] init];
df.dateStyle = NSDateFormatterMediumStyle;
label.text = [NSString stringWithFormat:@"%@",[df stringFromDate:datePicker.date]];

    NSLog(@"I am inside the datePickerValueChanged   - - %@", label.text);
[df release];
    globalValue1 = label.text;

   // use a global variable to copy the value from the pickerView. //
   }    

Now in the textFieldDidEndEditing:

-(void) textFieldDidEndEditing:(UITextField *)textField {
if (textField.tag ==0)
   [textField setText: globalValue0];

if (textField.tag ==1)
   [textField setText: globalValue1];

}

And to resign UIDatePicker, set the UIView as a UIControl and

resignFirstResponder
笑红尘 2024-11-21 11:06:18

我认为您需要将 UIPickerView 放在可视屏幕“外部”,并在按下按钮时为其设置动画。我不太确定摆脱它的最佳方法是什么,但您可能可以在选择器可见时监听父视图上的点击,然后将其动画化。

I think that you need to put your UIPickerView "outside" the viewable screen and animate it in when the button is pressed. I'm not really sure what the best way to get rid of it would be but you could probably listen for a tap on the parent view when the picker is visible and then animate it back out.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文