【问题标题】:Select row After UIPickerView is loaded加载 UIPickerView 后选择行
【发布时间】:2009-05-01 19:59:48
【问题描述】:

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

例如:假设我有一个UIPickerView,其中加载了 X 个 iPhone 用户朋友的名字(名字的数量是可变的;它可以是 1 或 1000,并且全部通过用户)。 iPhone 用户有一个偏好设置,即他们当前最好的朋友是 TED。我希望 UIPickerView 在显示时位于 TED 的位置。

我在哪里打电话给selectRow

我在viewDidAppear 中尝试过,但它从未被调用,在titleForRow 中导致了各种奇怪的行为。 viewDidLoadviewWillAppear 是不可能的,因为我还不知道选择器的数据源中有什么。

【问题讨论】:

  • 加载数据并授予委托后,只需将@jab 代码放在他的答案中。这对我有用!

标签: objective-c iphone cocoa-touch uipickerview


【解决方案1】:

检索数据后调用它。我不知道你在哪里加载数据,所以这只是应该工作的模型。如果这没有意义,请告诉我您在哪里加载数据,以便我可以在脑海中将其拼凑起来:)

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

【讨论】:

  • 谢谢,我正在检索 viewDidLoad 中的数据,就像您的模型一样。我必须创建一个方法来枚举列表以查找匹配索引,然后设置选择器。我想也许我错过了一个可以在选择器加载后返回事件循环之前使用的回调。
  • 它可以工作,但为什么它会导致加载视图时出现如此多的延迟? (在标签栏情况下)
  • @Jab 你的答案是正确的,然后再打电话给selectRow 不要忘记打电话给reloadAllComponents !!!!
  • 多么奇怪!但我有一个问题))为什么这个序列有效? (reloadAllComponents -> selectRow)
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    将其放置在您初始化包含UIPickerView 作为子视图的UIView 的任何位置:

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

    【讨论】:

      【解决方案4】:

      我刚刚发现在 4.3 SDK 的组件加载行为在 iPhone 和 iPad 之间是不同的。在 iPhone 上,我正要在添加到子视图层次结构之前或之后初始化视图之后立即调用 selectRow:。然而,在 iPad 上, selectRow 调用没有产生任何结果。我最终使用了 performSelector:withObject:afterDelay: 调用来等待 0.1 秒,然后再触发 selectRow:inComponent:animated:。这在 iPhone 和 iPad 上产生了可预测的结果。

      【讨论】:

        【解决方案5】:

        对于 Swift 来说很简单:

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

        【讨论】:

          【解决方案6】:

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

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

          【讨论】:

            猜你喜欢
            • 2012-03-09
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多