【问题标题】:change content of UIPickerView when hour changes?小时更改时更改 UIPickerView 的内容?
【发布时间】:2015-02-19 18:43:54
【问题描述】:

解决方案:我可以在时间改变时触发一个 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
    }

【问题讨论】:

    标签: ios swift datepicker uipickerview


    【解决方案1】:

    您可以获取一天中的当前小时并只需添加一个:

    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()
    }
    

    【讨论】:

    • 谢谢,我会试试这个方法。关于重载,是的,但是我可以把这个重载方法放在哪里?
    • 在你更新你的阵列之后把它放在某个地方。目前在您的 loadData 中。
    • 您应该将 .HourCalendarUnit 更改为新格式 .CalendarUnitHour
    • return NSCalendar.currentCalendar().component(.CalendarUnitHour, fromDate: NSDate()) + 1
    • 好的,谢谢你的回答,我实际上可以用一个只工作一次的简单 NSTimer 来触发该方法。我会保留对 NSCalendar 方法的建议,感谢您的回答
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-23
    • 2018-08-13
    • 1970-01-01
    • 1970-01-01
    • 2019-08-08
    • 2013-03-06
    • 1970-01-01
    相关资源
    最近更新 更多