小时更改时更改 UIPickerView 的内容?
change content of UIPickerView when hour changes?
解决方案:我可以在时间改变时触发 NSTimer,方法是在 viewDidLoad 的开头创建它。
上一条消息:
我想更改 UIPickerView 中列表中的内容,以便第一个选项始终是当前小时 +1。如果用户在 15:59 启动应用程序,第一项将为 16:00。但是如果是16:01,第一项应该是17:00.
我怎样才能重新加载数据,以便用户在任何时候查看选择器时,第一项始终是 currentHour+1?
我在loadData()
中重新初始化array
,如果我在viewforRow中添加它,pickerView是空的。
func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
return array.count
}
func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String! {
return array[row]
}
func loadData(){
var formatter = NSDateFormatter()
formatter.dateFormat = "HH"
let date = NSDate()
let str = formatter.stringFromDate(date)
let hourNow = str.toInt()!
if ( hourNow+1 < 22 ){
array = [String]()
for (var i = hourNow+1; i<22; i++) { //if 15:00:
let num : Int = i //starts at 16:00
array.append(num.toString())
}
}
}
//view for row
func pickerView(pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusingView view: UIView!) -> UIView {
var mView = UIView(frame: CGRectMake(0,0, 50,20))
let label = UILabel(frame:CGRectMake(0,0, 50,20))
label.text = array[row]
mView.addSubview(label)
return mView
}
您可以获得当天的当前小时,只需添加一个:
func currentHourPlusOne()->Int{
var now = NSDate()
var calendar = NSCalendar.currentCalendar()
var components = calendar.components(.CalendarUnitHour, fromDate: now)
return components.hour + 1
}
或者,简短的版本(感谢 Leonardo)
func currentHourPlusOne()->Int{
return NSCalendar.currentCalendar().component(.CalendarUnitHour, fromDate: NSDate()) + 1
}
如您所见,我获取当前日期并将其加载到 NSCalendar
中,我只获取小时。小时始终是当前小时。例如如果是10:30,小时是10。所以你只需要增加一个小时,你就得到了你想要的。
要重新加载 UIPickerView
,只需在 loadData
方法中将数组更新为最后一行后在选择器上调用 reloadAllComponents
:
func loadData(){
var formatter = NSDateFormatter()
formatter.dateFormat = "HH"
let date = NSDate()
let str = formatter.stringFromDate(date)
let hourNow = str.toInt()!
if ( hourNow+1 < 22 ){
array = [String]()
for (var i = hourNow+1; i<22; i++) { //if 15:00:
let num : Int = i //starts at 16:00
array.append(num.toString())
}
}
picker.reloadAllComponents()
}
解决方案:我可以在时间改变时触发 NSTimer,方法是在 viewDidLoad 的开头创建它。
上一条消息:
我想更改 UIPickerView 中列表中的内容,以便第一个选项始终是当前小时 +1。如果用户在 15:59 启动应用程序,第一项将为 16:00。但是如果是16:01,第一项应该是17:00.
我怎样才能重新加载数据,以便用户在任何时候查看选择器时,第一项始终是 currentHour+1?
我在loadData()
中重新初始化array
,如果我在viewforRow中添加它,pickerView是空的。
func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
return array.count
}
func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String! {
return array[row]
}
func loadData(){
var formatter = NSDateFormatter()
formatter.dateFormat = "HH"
let date = NSDate()
let str = formatter.stringFromDate(date)
let hourNow = str.toInt()!
if ( hourNow+1 < 22 ){
array = [String]()
for (var i = hourNow+1; i<22; i++) { //if 15:00:
let num : Int = i //starts at 16:00
array.append(num.toString())
}
}
}
//view for row
func pickerView(pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusingView view: UIView!) -> UIView {
var mView = UIView(frame: CGRectMake(0,0, 50,20))
let label = UILabel(frame:CGRectMake(0,0, 50,20))
label.text = array[row]
mView.addSubview(label)
return mView
}
您可以获得当天的当前小时,只需添加一个:
func currentHourPlusOne()->Int{
var now = NSDate()
var calendar = NSCalendar.currentCalendar()
var components = calendar.components(.CalendarUnitHour, fromDate: now)
return components.hour + 1
}
或者,简短的版本(感谢 Leonardo)
func currentHourPlusOne()->Int{
return NSCalendar.currentCalendar().component(.CalendarUnitHour, fromDate: NSDate()) + 1
}
如您所见,我获取当前日期并将其加载到 NSCalendar
中,我只获取小时。小时始终是当前小时。例如如果是10:30,小时是10。所以你只需要增加一个小时,你就得到了你想要的。
要重新加载 UIPickerView
,只需在 loadData
方法中将数组更新为最后一行后在选择器上调用 reloadAllComponents
:
func loadData(){
var formatter = NSDateFormatter()
formatter.dateFormat = "HH"
let date = NSDate()
let str = formatter.stringFromDate(date)
let hourNow = str.toInt()!
if ( hourNow+1 < 22 ){
array = [String]()
for (var i = hourNow+1; i<22; i++) { //if 15:00:
let num : Int = i //starts at 16:00
array.append(num.toString())
}
}
picker.reloadAllComponents()
}