如何在UIPickerView中更改起始行的文本颜色

时间:2016-06-22 14:42:21

标签: ios uipickerview

我试图显示以唯一文字颜色显示所选行的UIPickerView。因此,所选行应以红色字体显示,所有其他(未选定)行以黑色/默认字体显示。

我已经实现了这个:

- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component {
    UILabel *label = (UILabel*)[pickerView viewForRow:row forComponent:component];
    label.textColor = [UIColor redColor];

    UILabel *oldLabel = (UILabel*)[pickerView viewForRow:self.previouslySelectedRow forComponent:component];
    oldLabel.textColor = [UIColor blackColor];

    self.previouslySelectedRow = row;
}

在完美地更改选择时有效,但对显示的初始行没有任何作用。

我在打电话:

[pickerView selectRow:initialRow inComponent:0 animated:NO];

我显示UIPickerView后,但我意识到这不会导致didSelectRow被调用(仅当用户手动更改选择时才会发生)。

我尝试自己设置UILabel textColor值,例如:

    UILabel *label = (UILabel*)[pickerView viewForRow:startingRow forComponent:0];
    label.textColor = [UIColor redColor];

但遗憾的是,没有任何结果。我在显示选择器视图后调用它。

有一些简单的方法吗?我错过了什么吗?感谢您的帮助!

扎克

2 个答案:

答案 0 :(得分:0)

我最近刚在Xamarin Monotouch工作时出现过这个问题(.net for iOS)我找不到一个“干净”的修复程序,但我做了一个非常小的黑客,到目前为止似乎工作正常。我将在C#中提供我的解决方案,道歉,因为我可以阅读ObjC但是我只会通过尝试编写它来使自己难堪。你希望这个想法很容易。

  • 覆盖UIPickerViewDelegate。添加一个int字段,我们将使用该字段填充首先使用选择器控件时需要选择的dataitem的索引。

    protected class PickerDelegate : UIPickerViewDelegate
    {
        // Contruction...overrides etc
    
        public int SelectIndexOnLoad { get; set; }
    }
    
  • 现在在您加载/实例化pickercontrol(ViewDidLoad等)的代码区域中,找到数据源的索引,其中包含您要在选择器中首先显示/选择的数据。

        // First get the index value of the current set of data you
        // want to display, assuming here I have a list of items as my
        // picker datasource
    
        var x = this.items.IndexOf(data_value_to_display);
    
        // Then assign it to our PickerDelegate.SelectIndexOnLoad
    
        this.myPickerDelegate.SelectIndexOnLoad = x;
        this.myPickerView.selectRow(x, 0, true);
    
        // Note in Xamarin, the objc delegate call selectRow() is mapped to Select()
    
  • 在pickerdelegates viewForRow()调用(Xamarin objC调用映射到GetView())中,我们将PickerDelegate.SelectIndexOnLoad与传递的行变量进行比较,并决定UI值

        public override UIView viewForRow(UIPickerView pickerView, int row, int component, UIView view)
        {
            // Forget reusing the passed view
            // there is a bug in ios 7,8,9 which ensures its ALWAYS null, nice Apple!
            var view1 = new UILabel(predefined_rect_size);
            if (this.SelectIndexOnLoad == row)
            {
                view1.BackgroundColor = UIColor.Pink;
            }
            else
            {
                view1.BackgroundColor = UIColor.White;
            }
    
        // Optionally reset the SelectIndexOnLoad so that as the user moves
        // the picker (viewForRow is called constantly for redraws)
        // it goes back to normal color once moved.
        // If you want to keep it colored so the user knows the old original value
            // Simply omit this line
            this.SelectIndexOnLoad = row;
    
            return view1;
    
        }
    

这很好,但是,我不喜欢它。我希望一个ObjC大师能够启发我们,但在那之前,这个黑客做了伎俩。 最诚挚的问候

答案 1 :(得分:0)

要检查的3件事

1。 'pickerView.selectRow'在哪里叫?

不应在viewDidLoad或viewWillAppear中调用它 而是将它们放在viewDidLayoutSubviews(prefer)或viewDidappear中 给一些时间     pickerView(_ pickerView:UIPickerView,viewForRow row:Int ..) 返回所有UIView

(对于iphone6及更高版本,如果将其放在viewDidLayoutSubviews中, 在选择行之前添加'self.yourPIckerView.layoutIfNeeded()'

2。应该手动调用didSelectRow

'pickerView.selectRow'不会自动触发didSelectRow。 在该行之后,将其置于手动触发它。     self.pickerView(self.yourPickerView,didSelectRow:row,inComponent:comp)

3。动画参数应为'false'

'pickerView.selectRow(row,inComponent:comp,animated:false)'

如果它是'true',那么选择器最终会到达您手动选择的行需要一些时间 延迟

可以忽略颜色变化