用UIDatePicker替换UITextField输入

7

我有一个表视图控制器,其中一个单元格要表示日期。我按照这篇文章 "如何制作只覆盖屏幕一半的模态日期选择器?" 进行操作,现在它能够工作了,但是有一个大问题——我无法让这个选择器消失!

我尝试注册 UIControlEventTouchUpOutside 事件,但似乎选择器不会生成此事件(或者至少不在我使用它的模式下生成)。

有什么办法可以识别用户何时完成日期选择吗?

此外,有没有办法禁止用户直接在 UITextField 中输入?我想强制他们使用选择器进行操作。我看到了这篇文章 "如何用 UIDatePicker 替换 UITextField 输入内容?",但还有其他方法吗?

谢谢,

--John

2个回答

12

尝试这段代码...我在 uitextfield 中放置了一个 datepicker,它将在右上角的导航栏上有一个“完成”按钮.. 因此,通过点击“完成”,用户就可以关闭datepicker了.. 另一个最好的方法是在datepicker上方放置一个工具条,其中包含完成按钮.. 尝试一下,它会起作用.. 当更改datepicker时,您可以填充文本字段.. 希望这能帮助到你..

请参阅 stackoverflow 链接 https://dev59.com/i2445IYBdhLWcg3wgqnT#4824319,这将在键盘上方具有带有完成按钮的工具栏的datepicker。

#pragma mark -
#pragma mark - TextField Delegate

- (BOOL)textFieldShouldReturn:(UITextField *)textField 
{
    [textField resignFirstResponder];
    return TRUE;
}


- (void) textFieldDidBeginEditing:(UITextField *)textField {
    itsRightBarButton.title  = @"Done";
    itsRightBarButton.style = UIBarButtonItemStyleDone;
    itsRightBarButton.target = self;
    itsRightBarButton.action = @selector(doneAction:);
    if ([textField isEqual:itsIncidentDateTextField])
    {
        itsDatePicker = [[[UIDatePicker alloc] init] autorelease];
        itsDatePicker.datePickerMode = UIDatePickerModeDate;
        [itsDatePicker addTarget:self action:@selector(incidentDateValueChanged:) forControlEvents:UIControlEventValueChanged];
        //datePicker.tag = indexPath.row;
        textField.inputView = itsDatePicker;
    }
}

- (IBAction) incidentDateValueChanged:(id)sender{
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateFormat:@"MMM d, yyyy"];
    itsIncidentDateTextField.text = [dateFormatter stringFromDate:[itsDatePicker date]];
    [dateFormatter release];
}

我看到这是在联系人中使用的技术,比如添加生日。我需要重新设计我的视图,因为我当前有一个“取消”按钮作为右侧栏按钮项。我会尝试一下。感谢您的答案! - johnnyspo
我确实就是这么做的!!再次感谢。 - johnnyspo

-2

我使用了一种不同的方法来隐藏UIDatePicker。

创建一个XIB(nib)文件,并将UIDatePicker添加到其中,然后调整视图大小,使其仅适合UIDatePicker,然后在您的ViewController中创建一个属性(使其强且非原子),或者您正在使用的任何类,然后当然进行合成。

@property (nonatomic, strong) UIView *myDatePickerView;  
@synthesize myDatePickerView;

然后创建一个loadDatePickerView方法

- (void) loadDatePickerView
{
    UINib *nib = [UINib nibWithNibName:kNIBname bundle:[NSBundle mainBundle]];
    NSArray *views = [nib instantiateWithOwner:self options:nil];
    self.myDatePickerView = [views firstObject];
    [myDatePickerView setFrame:CGRectMake(0, 318, 320, 162)];
    [self.view addSubview:myDatePickerView];
}

实现UITextFieldDelegate,并在textFieldDidBeginEditing方法中调用loadDatePickerView方法。

[self loadDatePickerView];

为了创建一个属性,它是一个UIDatePicker实例的函数

@property (nonatomic,strong) 

UIDatePicker *myDatePicker;

(当然是合成的)

现在创建一个IBAction,如下所示:

-(IBAction)datePickerValueChanged:(UIDatePicker *)sender
{
    myDatePicker = [[myDatePickerView subviews] lastObject];
    //now you can do whatever you want with the DatePicker
}

现在将IBAction连接到XIB文件中的选择器,这样XIB现在就是您在VC中创建的UIDatePicker实例。如果您希望它消失,您可以添加一个UITapGestureRecognizer(在ViewDidLoad中),并且选择器将是另一个IBAction,该操作会将myDatePickerView从其父视图中移除,如下所示:
- (void)viewDidLoad
{
    [super viewDidLoad];
    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self     action:@selector(dropPicker:)];
    [self.view addGestureRecognizer:tap];
    [self datePickerValueChanged:myDatePicker];
}

-(IBAction)dropPicker:(id)sender
{
    [myDatePickerView removeFromSuperview];
} 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接