我试图显示以唯一文字颜色显示所选行的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];
但遗憾的是,没有任何结果。我在显示选择器视图后调用它。
有一些简单的方法吗?我错过了什么吗?感谢您的帮助!
扎克
答案 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)
不应在viewDidLoad或viewWillAppear中调用它 而是将它们放在viewDidLayoutSubviews(prefer)或viewDidappear中 给一些时间 pickerView(_ pickerView:UIPickerView,viewForRow row:Int ..) 返回所有UIView
(对于iphone6及更高版本,如果将其放在viewDidLayoutSubviews中, 在选择行之前添加'self.yourPIckerView.layoutIfNeeded()'
'pickerView.selectRow'不会自动触发didSelectRow。 在该行之后,将其置于手动触发它。 self.pickerView(self.yourPickerView,didSelectRow:row,inComponent:comp)
'pickerView.selectRow(row,inComponent:comp,animated:false)'
如果它是'true',那么选择器最终会到达您手动选择的行需要一些时间 延迟
可以忽略颜色变化