日期选择器在文本字段 iOS 8 上崩溃

Posted

技术标签:

【中文标题】日期选择器在文本字段 iOS 8 上崩溃【英文标题】:Datepicker crashes on textfield iOS 8 【发布时间】:2014-12-26 10:59:25 【问题描述】:

我在UITextField 上使用了UIDatePicker。我已经按UITextField 第一次使用日期选择器选择日期(应用程序工作正常),第二次当我再次按UITextField 使用UITextField 选择在UITextField 上设置的新日期时@ 使用UIDatePicker 然后应用程序崩溃。

我没有使用UITableView,我使用的是viewController的简单视图。

请帮帮我...

谢谢

 - (void)viewDidLoad
    
        [super viewDidLoad];

           form=[[NSDateFormatter alloc]init];
        [form setDateFormat:@"MM-dd-yyyy"];
        datePicker=[[UIDatePicker alloc]init];//Date picker
        datePicker.frame=CGRectMake(0,0,320, 216);
        datePicker.backgroundColor = [UIColor whiteColor];

    


- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
        BOOL a;
        if (textField.tag==10) 


        UIViewController* popoverContent = [[UIViewController alloc] init]; //ViewController

        UIView *popoverView = [[UIView alloc] init];   //view
        popoverView.backgroundColor = [UIColor blackColor];


        datePicker.datePickerMode = UIDatePickerModeDate;
        [datePicker setMinuteInterval:5];
        [datePicker setTag:10];



        [datePicker addTarget:self action:@selector(Result) forControlEvents:UIControlEventValueChanged];
        [popoverView addSubview:datePicker];

        popoverContent.view = popoverView;
            UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:popoverContent];
            navigationController.delegate=self;


            popoverController = [[UIPopoverController alloc]
                                      initWithContentViewController:navigationController];
        popoverController.delegate=self;


        [popoverController setPopoverContentSize:CGSizeMake(320, 250) animated:NO];


        [popoverController presentPopoverFromRect:textField.frame inView:self.addView permittedArrowDirections:UIPopoverArrowDirectionUp animated:YES];
                        a=NO;

    
        else
        
            a=YES;
        
        return a;
    

 -(void)Result
    
        NSDateFormatter *formDay = [[NSDateFormatter alloc] init];
        formDay.dateFormat=@"MM-dd-yyyy";
        NSString *day = [formDay stringFromDate:[datePicker date]];
        self.edit_dob.text = day;
      

错误

*** Assertion failure in -[UIPickerTableView _createPreparedCellForGlobalRow:withIndexPath:willDisplay:], /SourceCache/UIKit/UIKit-3318.16.14/UITableView.m:9269
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'UITableView dataSource is not set'

我已经分享了一个截图。我第一次成功选择日期,当我按下以在该文本字段上重置新日期时,应用程序崩溃。

【问题讨论】:

由于您的代码格式很难阅读。 由于堆栈溢出混蛋,您需要加 1... 令人讨厌的人 【参考方案1】:
datePicker.datePickerMode = UIDatePickerModeDate;
[datePicker setMinuteInterval:5];
[datePicker setTag:10];

[datePicker addTarget:self action:@selector(Result) forControlEvents:UIControlEventValueChanged];
[popoverView addSubview:datePicker];

每次聚焦文本字段时,您都在重复这些操作。这种做法是完全错误的,并且是您遇到的各种意外行为的潜在原因。它第一次起作用的事实使我认为这些不必要的重复动作之一是罪魁祸首。 (我敢打赌addTarget:forControlEvents: 方法调用。在任何情况下都不应该这样做。我什至不知道当您再次尝试添加相同的目标时会发生什么。)

您应该更好地构建您的代码以使这些方法只调用一次,而不是像您显示的代码中那样多次调用(例如在viewDidLoad 而不是textFieldShouldBeginEditing:),并且很可能错误会消失.

【讨论】:

【参考方案2】:

您需要保留日期选择器对象,即:

@property(nonatomic,strong) UIDatePicker *datePicker;

在 .h 文件中。

这里是更新的代码:

 - (void)viewDidLoad
 
    [super viewDidLoad];

    form=[[NSDateFormatter alloc]init];
    [form setDateFormat:@"MM-dd-yyyy"];
    _datePicker=[[UIDatePicker alloc]init];//Date picker
    _datePicker.frame=CGRectMake(0,0,320, 216);
    _datePicker.backgroundColor = [UIColor whiteColor];
    _datePicker.datePickerMode = UIDatePickerModeDate;
    [_datePicker setMinuteInterval:5];
    [_datePicker setTag:10];
    [_datePicker addTarget:self action:@selector(Result)    forControlEvents:UIControlEventValueChanged];

 


- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField


    BOOL a;
    if (textField.tag==10) 


        UIViewController* popoverContent = [[UIViewController alloc] init]; //ViewController
        UIView *popoverView = [[UIView alloc] init];   //view
        popoverView.backgroundColor = [UIColor blackColor];
        [popoverView addSubview:_datePicker];
        popoverContent.view = popoverView;
        UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:popoverContent];
        navigationController.delegate=self;

        UIPopoverController *popoverController = [[UIPopoverController alloc]
                                 initWithContentViewController:navigationController];
        popoverController.delegate=self;
        [popoverController setPopoverContentSize:CGSizeMake(320, 250) animated:NO];

        [popoverController presentPopoverFromRect:textField.frame inView:textField permittedArrowDirections:UIPopoverArrowDirectionUp animated:YES];
        a=NO;

    
    else
    
        a=YES;
    
    return a;


 -(void)Result
 
    NSDateFormatter *formDay = [[NSDateFormatter alloc] init];
    formDay.dateFormat=@"MM-dd-yyyy";
    NSString *day = [formDay stringFromDate:[_datePicker date]];
    _edit_dob.text = day;
 

【讨论】:

每次聚焦文本字段时,您都在重复这些操作。 datePicker.datePickerMode = UIDatePickerModeDate; [datePicker setMinuteInterval:5]; [datePicker setTag:10]; [datePicker addTarget:self action:@selector(Result) forControlEvents:UIControlEventValueChanged];

以上是关于日期选择器在文本字段 iOS 8 上崩溃的主要内容,如果未能解决你的问题,请参考以下文章

jquery 日历/日期选择器

使用日期选择器在文本框中进行验证

在文本字段点击上显示日期选择器

UIDatePicker:无法选择默认值

使 eternicode 日期选择器在点击时打开,而不是焦点

为啥 jQuery UI 日期选择器在 jQuery 对话框模式中不起作用?