UIDatePicker valuechanged不会更新第一次旋转,但会在iOS之后进行每次旋转

时间:2015-02-03 09:06:35

标签: ios datepicker

我有一个嵌入在静态TableViewCell中的UIDate Picker,目前我禁用了大部分代码,除了负责日期选择器的代码。

我正在使用日期选择器作为倒数计时器

所以除了一些常见的出口和变种外,这就是全部:

override func viewDidLoad() {
    super.viewDidLoad()

    //  tfName.delegate = self
    //  tfDescription.delegate = self
    //

    datePicker.countDownDuration = 60

    //  pickerValueChanged(self)

}


@IBAction func pickerValueChanged(sender: AnyObject) {

     seconds  = Int(datePicker.countDownDuration)
     hours  = seconds / 3600
    if hours == 0{
        minutes = seconds / 60
    } else{
        minutes = seconds % 3600 / 60
    }
    labelDuration.text = "\(hours) hours \(minutes) minutes"
}

我第一次更改Picker的值时,更改后的值函数根本不会触发,但是在它之后的旋转没有失败。

我尝试在viewDidLoad中使用pickerValueChanged(self)来调用它,但这样做有效,但无法解决问题。我还注释了pickerValueChanged函数和viewDidLoad中的每一行代码,但它仍然没有触发第一次旋转..

感谢您的时间!

更新:添加图片

第一次旋转后,不会调用pickerValueChanged: First spin

从第二次旋转开始,调用事件并更新标签: Second spin

尝试:

执行:     datePicker.setDate(NSDate(), animated: true中的viewDidLoad() 解决了在第一次旋转时未调用事件的问题,但这会将日期选择器的初始状态设置为当前时间。由于我使用此控件为事件设置持续时间,我想让它从0小时1分钟开始。 这可以通过datePicker.countDownDuration = 60来完成,但在此之后,主要问题又会重新出现。 因此,解决方案可能是将DatePicker设置为1分钟的NSDate,但是如何做到这一点?

解决方案:

var dateComp : NSDateComponents = NSDateComponents()
dateComp.hour = 0
dateComp.minute = 1
dateComp.timeZone = NSTimeZone.systemTimeZone()
var calendar : NSCalendar = NSCalendar(calendarIdentifier: NSGregorianCalendar)!
var date : NSDate = calendar.dateFromComponents(dateComp)!

datePicker.setDate(date, animated: true)

8 个答案:

答案 0 :(得分:5)

我提出了以下解决方案,用0小时1分钟初始化datePicker组件(倒数计时器模式),并在第一次旋转时直接响应。因为这似乎是一个错误,并且如果你想要一个textlabel在更改datePicker时更新它的值并且它在第一次没有时它是非常令人沮丧的:

var dateComp : NSDateComponents = NSDateComponents()
dateComp.hour = 0
dateComp.minute = 1
dateComp.timeZone = NSTimeZone.systemTimeZone()
var calendar : NSCalendar = NSCalendar(calendarIdentifier: NSGregorianCalendar)!
var date : NSDate = calendar.dateFromComponents(dateComp)!

datePicker.setDate(date, animated: true)

我的实现并不需要timeZone组件。

答案 1 :(得分:3)

这是@Henk-Martijn的解决方案已更新&简化为Swift 3

/* HTML to Microsoft Word Export
* This code demonstrates how to export an html element to Microsoft Word
* with CSS styles to set page orientation and paper size.
* Tested with Word 2010, 2013 and FireFox, Chrome, Opera, IE10-11
* Fails in legacy browsers (IE<10) that lack window.Blob object
*/
function saveDoc() {

  if (!window.Blob) {
    alert('Your legacy browser does not support this action.');
    return;
  }

  var html, link, blob, url, css;

  // EU A4 use: size: 841.95pt 595.35pt;
  // US Letter use: size:11.0in 8.5in;

  css = ('\
   <style>\
   @page WordSection1{size: 841.95pt 595.35pt;mso-page-orientation: portrait;}\
   div.WordSection1 {page: WordSection1;}\
   h1 {font-family: "Times New Roman", Georgia, Serif; font-size: 16pt;}\
   p {font-family: "Times New Roman", Georgia, Serif; font-size: 14pt;}\
   </style>\
  ');

  var rightAligned = document.getElementsByClassName("sm-align-right");
  for (var i=0, max=rightAligned.length; i < max; i++) {
    rightAligned[i].style = "text-align: right;"
  }

  var centerAligned = document.getElementsByClassName("sm-align-center");
  for (var i=0, max=centerAligned.length; i < max; i++) {
    centerAligned[i].style = "text-align: center;"
  }

  html = document.getElementById('text').innerHTML;
  html = '\
  <html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns="http://www.w3.org/TR/REC-html40">\
  <head>\
    <title>Document Title</title>\
    <xml>\
      <w:worddocument xmlns:w="#unknown">\
        <w:view>Print</w:view>\
        <w:zoom>90</w:zoom>\
        <w:donotoptimizeforbrowser />\
      </w:worddocument>\
    </xml>\
  </head>\
  <body lang=RU-ru style="tab-interval:.5in">\
    <div class="Section1">' + html + '</div>\
  </body>\
  </html>'

  blob = new Blob(['\ufeff', css + html], {
    type: 'application/msword'
  });

  url = URL.createObjectURL(blob);
  link = document.createElement('A');
  link.href = url;

  filename = 'filename';

  // Set default file name.
  // Word will append file extension - do not add an extension here.
  link.download = filename;   

  document.body.appendChild(link);

  if (navigator.msSaveOrOpenBlob) {
    navigator.msSaveOrOpenBlob( blob, filename + '.doc'); // IE10-11
  } else {
    link.click(); // other browsers
  }

  document.body.removeChild(link);
};

使用上面的代码而不是像:

let calendar = Calendar(identifier: .gregorian)
let date = DateComponents(calendar: calendar, hour: 1, minute: 30).date!
datePicker.setDate(date, animated: true)

答案 2 :(得分:2)

时间以前,我发现了另一个与此类似的问题。它是关于在tableView:didSelectRowAtIndexPath:内呈现一个视图控制器,问题在于它需要花费大量时间让新控制器实际出现。其中一个解决方法是在主队列中使用dispatch_async。在这种情况下,同样适合我。

在我的viewDidLoad中,我异步调度主队列上的选择器设置代码,在我的情况下,即使在第一个选择中,它也开始响应valueChanged事件:

DispatchQueue.main.async {
    self.pickerView.datePickerMode = .countDownTimer
    self.pickerView.minuteInterval = 5
    self.pickerView.countDownDuration = 15
}

答案 3 :(得分:1)

我认为你应该尝试实现这个代理

- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component

答案 4 :(得分:1)

这似乎与动画参数有关。 你只需要这一行:

datePicker.setDate(date, animated: true)

答案 5 :(得分:0)

我不知道我是否遇到了您的问题,但是日期选择器使用目标操作模式工作,并在您更改值时触发此机制。
因此,如果问题是显示的第一个值,则应初始化变量,将其作为“默认”值。

答案 6 :(得分:0)

与上面类似的问题,我用过

DispatchQueue.main.asyncAfter(deadline: .now()) {
   self.datePicker.countDownDuration = 60
}

把它放在下一个runloop上。似乎是一个可行的解决方法。

答案 7 :(得分:0)

实际上你只需要在viewDidLoad中设置datePicker.countDownDuration = 60 ...在viewDidAppear或更高版本中添加它