textfield iOS 8上的日期选择器崩溃

textfield iOS 8上的日期选择器崩溃,ios,objective-c,iphone,ios8,uidatepicker,Ios,Objective C,Iphone,Ios8,Uidatepicker,我在UITextField上使用了UIDatePicker。我第一次按UITextField选择使用日期选择器的日期(应用程序工作正常),第二次再次按UITextField选择在UITextField使用UIDatePicker设置的新日期,然后应用程序崩溃 我使用的不是UITableView,而是viewController的简单视图 请帮帮我 谢谢 - (void)viewDidLoad { [super viewDidLoad]; form

我在
UITextField
上使用了
UIDatePicker
。我第一次按
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;
      }
错误

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

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

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


每次聚焦文本字段时,您都在重复这些操作。这种做法显然是错误的,并且可能导致各种意外行为,比如您遇到的行为。它第一次起作用的事实使我认为这些不必要的重复行为之一就是罪魁祸首。(我打赌
addTarget:forControlEvents:
方法调用。无论如何都不应该这样做。我甚至不知道再次尝试添加相同的目标时会发生什么。)


您应该更好地组织代码,使这些方法调用只进行一次,而不是像您所显示的代码中那样多次(例如,在
viewDidLoad
中而不是
textfield shouldbeginediting:
),并且很可能错误会消失。

您需要保留datepicker对象,即:

@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;
 }

由于您的代码格式很难阅读。由于堆栈溢出,您需要加1。。。sheesh people每次聚焦文本字段时,您都在重复这些操作。datePicker.datePickerMode=UIDatePickerModeDate;[datePicker setMinuteInterval:5];[日期选择器集合标签:10];[datePicker addTarget:self action:@selector(Result)for ControlEvents:UIControlEventValueChanged];
 - (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;
 }