加载 UIPickerView 后选择行

我有一个 iPhone 数据库应用程序,加载一个 UIPickerView与数据从一个表。我想从另一个表中的数据中将选定的行设置为特定的行。

例如: 假设我有一个 UIPickerView,它装载了 iPhone 用户朋友的 X 个名字(名字的数量是可变的; 它可以是1或1000,并且所有的名字都由用户输入到数据库中)。IPhone 用户有一个首选项集,它们当前最好的朋友是 TED。我希望 UIPickerView的位置是 TED时显示。

我在哪里呼叫 selectRow

我尝试在 viewDidAppear,但它从来没有被称为,在 titleForRow造成各种奇怪的行为。viewDidLoadviewWillAppear是不可能的,因为我还不知道什么是在数据源的选择器。

90087 次浏览

检索数据后再调用它。我不知道你在哪里加载数据,所以这只是一个样机什么应该工作。如果这没有意义,请让我知道您在哪里加载数据,这样我就可以在我的头脑中把它拼凑起来:)

-(void)viewDidLoad
{
// load data from sql
// self.someDataArray = DATAFROMSQL
[picker reloadAllComponents];
[picker selectRow:0 inComponent:0 animated:YES];
}

把这个放在任何你初始化包含你的 UIPickerViewUIView作为子视图的地方:

[myPickerView selectRow:rowWithTedsName inComponent:columnWithNames animated:NO];

当最初显示 UIPickerView 时,需要选择(默认) UIPickerView 项,这是一个常见问题。这个问题与事件的顺序有关。通过阅读以前的文章,似乎[ pickerView selectRow: n ]通常在视图控制器 ViewDidLoad 事件中调用。但是,UiPickerView 数据仅在 ViewDidLoad 事件之后加载,这意味着 ViewDidLoad 中的任何选择代码都没有效果。要进行补救,请将选择代码放置在 ViewDidAppear 中;

- (void) viewDidAppear:(BOOL)animated {
[m_pickerView selectRow:nSelectedItem inComponent:0 animated:YES]; }

我刚刚发现,在4.3 SDK 上,iPhone 和 iPad 的组件加载行为是不同的。在 iPhone 上,在添加到子视图层次结构之前或之后初始化视图之后,我将调用 selectRow: 。然而,在 iPad 上,selectRow 调用没有产生任何结果。最后,我使用了一个 PerformSelector: withObject: after 延迟: 调用,在触发 selectRow: inComponent: Animated: 之前等待0.1秒。这在 iPhone 和 iPad 上的结果是可以预见的。

如果希望选定的行永久突出显示,请使用

myPickerView.subviews[0].subviews[0].subviews[2].backgroundColor = myPickerView.tintColor;

对斯威夫特来说,这很简单:

self.picker?.selectRow(0, inComponent: 0, animated: true)