小时更改时更改 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()
}