7

我有一个表格视图控制器(其中包括一个代表日期的单元格)。我关注了这篇文章“如何制作一个只覆盖一半屏幕的模态日期选择器? ”我让它在一个很大的例外情况下工作——我不能让选择器消失!

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

如何识别用户已完成日期选择?

另外,有没有办法禁止用户直接输入 UITextField?我想强迫他们使用选择器。我看到了这篇文章“在 UITextField 中禁用闪烁光标? ”,但还有其他方法吗?

问候,

- 约翰

4

2 回答 2

12

试试这个代码..这里我把一个日期选择器放到一个uitextfield ..它会在右上角的导航栏有一个完成按钮..所以通过点击完成我将用户可以关闭日期选择器..另一个最好的方法是把具有完成按钮的日期选择器上方的工具栏..试试这个它会起作用..更改日期选择器时,您可以填充文本字段..希望这会有所帮助..

请参阅此 stackoverflow 链接https://stackoverflow.com/a/4824319/763747 这将具有带有完成按钮的日期选择器作为键盘上方的工具栏。

#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];
}
于 2012-06-16T19:37:08.480 回答
-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 从它的 superView 中删除,如下所示:

- (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];
} 
于 2013-12-15T18:56:39.960 回答