禁用自定义选取器中的特定行

时间:2011-12-13 06:16:24

标签: iphone ios ipad uipickerview

开发一个应用程序,显示具有以下值的选择器: 1.Morning 2.Noon 3.Evening

根据当前时间我需要显示各自的值。

如果它的3PM使用应该只能选择晚上。

现在我的问题是,有什么方法可以让“早晨和中午”无法选择。类似于日期选择器,我可以灰色选项??用户应该知道所有选项,但他应该能够根据时间选择选项。

提前感谢。

2 个答案:

答案 0 :(得分:2)

如果要在选择器视图中显示某些值,请使用以下委托API覆盖该位置的视图。

 - (UIView *)viewForRow:(NSInteger)row forComponent:(NSInteger)component

创建UILabel并将其文本颜色设置为灰色并将其作为上面的视图返回。

如果选择了灰色文本,请通过调用以下API为默认选择设置动画。

 - (void)selectRow:(NSInteger)row inComponent:(NSInteger)component animated:(BOOL)animated;

希望这有帮助。

答案 1 :(得分:0)

要使选择器中的行变灰,比创建自己的视图要容易得多。那就是使用attributedTitleForRow。

func pickerView(_ pickerView: UIPickerView, attributedTitleForRow row: Int, forComponent component: Int) -> NSAttributedString?

因为如果返回nil,此函数将退回到titleForRow,因此可以为禁用的行返回灰色,并使用标准的titleForRow返回其余部分。例如:

func pickerView(_ pickerView: UIPickerView, attributedTitleForRow row: Int, forComponent component: Int) -> NSAttributedString? {
    // Need to provide the below function isRowDisabled that returns true as needed
    if isRowDisabled(row:row) {
        let attributes = [NSAttributedStringKey.foregroundColor: UIColor.gray]
        let str = NSAttributedString(string: "my gray text on row \(row)", attributes:attributes)
        return str
    } else {
        return nil
    }
}

func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
    return "my normal text on row \(row)"
}

然后,您必须忽略其他答复中提到的禁用行的didSelectRow。