2013-11-24 15 views
23

我遇到了一個怪異的效果,肯定看起來像iOS7中的錯誤 - 但往往在過去,當我以爲我發現了蘋果的API中的錯誤,它竟然是我的自己的誤解。UIDatePicker錯誤? UIControlEventValueChanged達到最小內部後

我有一個使用datePickerMode = UIDatePickerModeCountDownTimer和minuteInterval = 5的UIDatePicker。我將持續時間初始化爲1小時,並將其呈現給用戶,並顯示爲帶有小時和分鐘的雙列選擇器。 (到目前爲止都很好)。

用戶正在考慮「20分鐘」,因此將Hour列的值滾動爲0.此時選取器讀取的時間爲0小時零分鐘,而iOS7並不酷,所以它會自動將分鐘滾動到5.我的UIControlEventValueChanged處理程序被調用,並且countDownDuration讀取5分鐘。 (仍然不錯)

現在用戶抓住分輪並將其拖動到20. AND ...我的UIControlEventValueChanged處理程序不會被調用。 (壞)

如果我在UI中有其他事件檢查日期選擇器在這一點上,我確實看到countDownDuration設置爲20.但我無法知道用戶改變它,在它被改變了。這是非常可重複的:它始終發生在第一次更改後,選擇器拒絕設置爲0(自動進入5分鐘)。

請注意,這是在iOS7;它不會發生在iOS6中(也許是因爲選擇器的內容完全可以設置爲0分鐘)。

所以......我錯過了什麼嗎?或者這是iOS7中的一個真正的bug?在後一種情況下,有沒有人知道一個解決方案比定期檢查當前時間間隔更好?

+0

轉載。對我來說看起來像一個bug。 – Kevin

回答

33

我也可以確認iOS 7.0.3 UIDatePicker在UIDatePickerModeCountDownTimer模式下使用時有一個錯誤。選擇器不會觸發與UIControlEventValueChanged事件關聯的目標動作,即用戶通過滾動輪來更改值時的第一個。它適用於後續更改。

下面是一個有效的解決方法。只需將將調度塊中countDownDuration的初始值設置爲主循環的代碼即可。每當車輪旋轉到新值時,您的目標行動方法都會啓動。這種方法幾乎沒有開銷,並且工作得很好在iPhone 4和iPad 4

dispatch_async(dispatch_get_main_queue(), ^{ 
    self.myDatePicker.countDownDuration = (NSTimeInterval) aNewDuration ; 
}); 
+0

@Rich我仍然可以在運行iOS 7.1的iPhone上重現iOS SDK 7.1上的問題。你有什麼配置來解決這個問題? –

+0

這很奇怪!這個錯誤在iOS 7.1上仍然存在,但這個答案中的修復工作適用於我。謝謝。 –

+8

這個錯誤仍然存​​在在iOS 8;/ – Shial

4

我還在打7.1這個問題,但添加以下固定它爲我UIControlEventValueChanged處理程序。

// Value Changed Event is not firing if minimum value hit 
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0.3 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{ 
    [self.myDatePicker setCountDownDuration: self.myDatePicker.countDownDuration]; 
}); 
+0

這適用於iOS 8下的我,而Positron的解決方案沒有。 – fatuhoku

+0

同樣在這裏,它似乎需要延遲 – cdstamper

2

如果有人仍然有日期選擇器的問題... 我使用斯威夫特/ iOS版8/6.3的Xcode

所以解決這個問題,你應該沒有用

picker.countDownDuration = NSTimeInterval 

相反,使用setDate

picker.setDate(NSDate, animated: true) 

它直接在viewDidLoad()上工作,不需要使用`隊列

1

如果有人仍然有datepicker的問題... 我使用Swift/iOS 8/Xcode 6。3

爲了解決這個問題,你不應該使用picker.countDownDuration = NSTimeInterval。使用.setDate(NSDate, animated: true)

它的作品直接上viewDidLoad(),不需要使用queues

完整的片段:

override func viewDidLoad() { 
    super.viewDidLoad() 
    picker.setDate(setDateFromSeconds(seconds), animated: true) 
} 

func setDateFromSeconds(seconds: Double) -> (NSDate) { 
    let intSeconds = Int(seconds) 
    let minutes = (intSeconds/60) % 60 
    let hours = intSeconds/3600 
    let dateString = NSString(format: "%0.2d:%0.2d", hours, minutes) 

    let dateFormatter = NSDateFormatter() 
    dateFormatter.dateFormat = "hh:mm" 
    return dateFormatter.dateFromString(dateString as String) as NSDate! 
} 
+0

感謝您包括時間間隔日期轉換的swift代碼。這對我有效。瘋狂的是,這個問題仍然發生在iOS 10中。 – Mikrasya

1

對於斯威夫特3:

DispatchQueue.main.async(execute: { 
    yourPicker.countDownDuration = TimeInterval() 
}) 
0

由於沒有回答是否已經被接受。在迅速3工作對我來說,最簡單的解決方案是簡單地做

datePicker.countDownDuration =秒

在viewDidAppear而不是viewDidLoad中

0

斯威夫特4

@IBOutlet weak var fromPickerView: UIDatePicker! 


@objc func toPickerViewDateChanged() { 
     fromPickerView.minimumDate = toPickerView.date 
    } 
    override func viewDidLoad() { 
     super.viewDidLoad() 



toPickerView.backgroundColor = UIColor.white 
    toPickerView.tintColor = .black 
    toPickerView.maximumDate = Date() 
    toPickerView.addTarget(self, action: 
    #selector(toPickerViewDateChanged), for: UIControlEvents.valueChanged) 
相關問題