【问题标题】:UIDatePicker in a popover randomly doesn't update the first time but will every time after that弹出窗口中的 UIDatePicker 随机不会第一次更新,但之后每次都会更新
【发布时间】:2016-09-23 17:30:09
【问题描述】:

我有一个 UIDatePicker 显示在弹出窗口中。当我旋转时,有一半的时间值不会更新,然后每次都会更新。另一半,它第一次更新,之后每次更新——正如预期的那样。

场景 1:点击、选择时间、更新、值更新、再次更新、再次值更新……重复。

场景 2:点击,选择时间,更新,值不更新,再次更新,值更新,再次更新,值更新......重复。

起初,它每次第一次都跳过更新,然后实施this answer's fix 似乎有所帮助,直到我更多地使用它,发现它现在只有大约一半的时间有效。

@property (nonatomic, strong) UIViewController *datePickerController;

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    if (indexPath.row == kAddEditProductsTargetBatchTime) {
        [self setupDatePickerWithIndexPath:indexPath];
    }
}

- (void)setupDatePickerWithIndexPath:(NSIndexPath *)indexPath {
    CGRect cellFrame = [self.tableView rectForRowAtIndexPath:indexPath];
    CGRect popoverFrame = CGRectMake(cellFrame.size.width - 100.0f, cellFrame.origin.y, 50.0f, cellFrame.size.height);

    CGSize dpSize = CGSizeMake(200, 180);
    _datePickerController = [[UIViewController alloc] init];

    UIDatePicker *datePicker=[[UIDatePicker alloc]init];

    datePicker.frame = CGRectMake(0,0,dpSize.width, dpSize.height);
    datePicker.datePickerMode = UIDatePickerModeCountDownTimer;
    datePicker.countDownDuration = 0;

    batchTarget *defaultCycleTarget = [cycleTargetRepository defaultCycleTarget:_product.cycleTargets]; //NSTimeInterval

    if (indexPath.row == kAddEditProductsTargetBatchTime) {
        NSDateComponents *dateComp = [NSDateComponents new];
        dateComp.hour = [NSNumberFormatter hoursComponent:defaultCycleTarget.targetBatchTime]; //NSTimeInterval
        dateComp.minute = [NSNumberFormatter minutesComponent:defaultCycleTarget.targetBatchTime]; //NSTimeInterval
        NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
        NSDate *pickerDate = [calendar dateFromComponents:dateComp];

        [datePicker setDate:pickerDate animated: YES];
        [datePicker addTarget:self action:@selector(batchTimeChanged:) forControlEvents:UIControlEventValueChanged];
    }
    _datePickerController.view = datePicker;

    _datePickerController.modalPresentationStyle = UIModalPresentationPopover;
    _datePickerController.preferredContentSize = dpSize;
    [self presentViewController:_datePickerController animated:YES completion:nil];
    _datePickerController.popoverPresentationController.sourceRect = popoverFrame;
    _datePickerController.popoverPresentationController.sourceView = self.view;
}

//timeChanged doesn't even get fired off.. randomly && only on the first try
- (void)timeChanged:(UIDatePicker *)sender {
    batchTarget *defaultCycleTarget = [cycleTargetRepository defaultCycleTarget:_product.cycleTargets];
    if (defaultCycleTarget) {
        defaultCycleTarget.targetBatchTime = sender.countDownDuration;
    } else {
        // If no defaultCycleTarget we need to initialize the data
        batchTarget *newCycleTarget = [batchTarget new];
        newCycleTarget.targetBatchTime = sender.countDownDuration;
        _product.cycleTargets = [NSArray arrayWithObject:newCycleTarget];
    }
    [self.tableView reloadData];
}

我基本上有same exact code in a different view using Swift 并遇到同样的问题。

【问题讨论】:

    标签: ios objective-c uikit uidatepicker


    【解决方案1】:

    似乎是 iOS 缓冲区问题。

    尝试更改运行循环并设置为 60 秒的倍数。它对我有用。

    - (void) someMethodName
    {
        [self performSelector:@selector(sel:) withObject:datePicker afterDelay:0];
    }
    
    - (void) sel:(UIDatePicker *)datePicker
    {
        datePicker.countDownDuration = 60;
    }
    

    【讨论】:

    • 所以我将[self performSelector:@selector(setDuration:) withObject:datePicker afterDelay:0]; 添加到setupDatePickerWithIndexPath- (void)setDuration:(UIDatePicker *)datePicker { datePicker.countDownDuration = 60; }。这使问题变得更糟,因为它总是现在需要两次旋转才能更新。
    猜你喜欢
    • 2015-04-02
    • 2012-02-17
    • 1970-01-01
    • 2020-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多