【问题标题】:Datepicker crashes on textfield iOS 8日期选择器在文本字段 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... 令人讨厌的人

标签: ios objective-c iphone ios8 uidatepicker


【解决方案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];
    猜你喜欢
    • 1970-01-01
    • 2015-08-19
    • 1970-01-01
    • 1970-01-01
    • 2012-10-01
    • 1970-01-01
    • 2020-12-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多