我有一个自定义UIPickerView,我在ViewController的ViewDidLoad方法中设置了模型。
我可以为我的PickerModel设置出现在GetView()覆盖中的每个行项目的外观,如下所示:
public override UIView GetView(UIPickerView pickerView, nint row, nint component, UIView view)
{
var selectedItem = pickerView.SelectedRowInComponent(0);
UILabel lbl = new UILabel(new CGRect(0, 0, 130f, 40f));
lbl.TextColor = UIColor.Black;
lbl.Font = UIFont.SystemFontOfSize(12f);
lbl.TextAlignment = UITextAlignment.Center;
lbl.Text = _values[(int)row];
if (row == selectedItem)
{
lbl.BackgroundColor = MyColours.GetBluish;
}
return lbl;
}
但if if用于设置当前所选项目外观的语句仅针对选择器中的第一个和最后一个项目触发。这是为什么?
需要注意的几件事 在我的ViewController中设置模型变量后,我的委托和数据源被设置为我的模型。这是代理和数据源应该如何工作的吗? 其他指南建议在UIPickerView子类中覆盖ViewForRow(Xamarin中的ViewFor)。但是当我与选择器交互时,不会调用此覆盖:(。
答案 0 :(得分:0)
它无效,因为UIPickerView在选择行之前调用GetView
。
改为覆盖Selected
,并更新当前视图:
public override void Selected(UIPickerView pickerView, nint row, nint component)
{
var view = pickerView.ViewFor(row, component);
view.BackgroundColor = Drive1Colours.GetBluish;
}