【问题标题】:Different strange behaviour withUIPickerView selectedRowInComponent in iOS5iOS5 中 UIPickerView 选择 RowInComponent 的不同奇怪行为
【发布时间】:2011-10-22 20:56:59
【问题描述】:

iOS5 更新后,我的应用现在发生了一件奇怪的事情。

我有一个 UIPickerView 并使用 [customPickerView selectedRowInComponent:0] 来获取选择的组件。用户选择第二行(索引为 1)

所以它看起来像:

i = [customPickerView selectedRowInComponent:0];   // -> i is 1 here, is OK!
[smsAgent  sendSMS:smsTxt]; //just call another method to send a SMS

检查时i的值是OK的。 现在我只需调用一个普通的短信对话smsAgent,它看起来基本上是这样的:

smsAgent...
      MFMessageComposeViewController *picker = [[MFMessageComposeViewController alloc] init];
      picker.messageComposeDelegate = delegate;
      picker.recipients =[NSArray arrayWithObject: myTelNumber];  
      [delegate presentModalViewController:picker animated:YES];

当然不会对我的选择器做任何事情。

但是当这个“返回”在

    - (void)messageComposeViewController:(MFMessageComposeViewController *)controller didFinishWithResult:(MessageComposeResult)result {
        [self dismissModalViewControllerAnimated:NO]; //take away the SMS screen fast, so we can send selectModeVCDidFinish to take away ourselves
        int j = [customPickerView selectedRowInComponent:0];
        [self.delegate selectModeVCDidFinish: selectedMode];
}

j 的值又是 0,而不是 1

当然,customPickerView 没有任何反应 - 我真的很困惑 - 这里发生了什么?

在升级到 iOS5 之前没有任何问题。

有什么我错过的吗?

非常感谢

【问题讨论】:

  • 这些调用都在同一个对象中吗?您为撰写控制器设置的“委托”是拥有袖珍视图的视图控制器?我的猜测是,在您的最后一个代码段中,customPickerView 实际上是 nil。
  • 不——不是这样,UIPickerView 仅在对象 A 中,它调用 smsAgent 对象,将自身作为委托。所以 smsAgent 返回到对象 A,它持有 UIPickerView。但是返回后,选择的值再次不正确...
  • 既然i 看起来像一个ivar,为什么不直接设置j = i
  • 是的,我会这样做 - 但是为什么 selectedRowInComponent 不再正常工作了?
  • 当您关闭消息撰写视图控制器并再次显示选择器控制器时,该行是否仍处于选中状态?当您在选择器控制器前面显示另一个视图控制器时,您可能会丢失选择

标签: iphone ios ios5 sms uipickerview


【解决方案1】:

感谢您详细解释问题。我的 UIPickerViews 有问题。正如我在上面的评论中提到的,我的代码是基于 CustomPickerView - http://iphonedevelopment.blogspot.co.uk/2009/02/longer-spinning-blurring-v20.html

此代码与 5.0 版本不同。经过大量研究后,我发现 UIPicker 调用委托函数的顺序/顺序不是问题。

但特别是非官方功能“scrollAnimationDuration”已被弃用且无法使用。这就是 UIPicker 不能长时间滚动的原因(就像 iOS 4.3.3 及更低版本一样)。

【讨论】:

    【解决方案2】:

    正如我在评论中所写,这种行为的原因是调用方法的顺序。让我详细解释一下:

    起始屏幕screenVC具有普通方法viewWillAppear和viewDidAppear。在这些消息中,选择器被创建(或任何元素)并设置为底层数据结构提供的值。所以假设选择器得到 10。

    现在在选择一个放入变量的不同值20时,我认为这将是节省的。

    现在 SMS 对话框打开并发送短信。

    但是现在发生的事情是这个奇怪问题的原因。当 SMS 对话框消失时 screenVC 会触发 viewWillAppear,这会将变量 BACK 设置为 10(因为数据结构尚未更新)

    现在短信返回到 didFinishWithResult 并且底层的 20 丢失了。

    因此,您需要做的就是确保用于从 sms didFinishWithResult 中更新数据结构的变量作为参数与您对屏幕的关闭调用一起传递。

    只是一个额外的问题。如果 screenVC 打开另一个 screen2VC,它只有选择器(并将值设置为 10)并且这个然后打开 sms 对话框,那就更令人惊讶了。当 sms 对话框返回时,它会导致 screen2VC 调用 viewWillAppear 和 viewDidAppear,即使它们已被解除。

    我想这是因为当 sms 对话框关闭时需要有 sms 对话框启动屏幕。

    希望我能解释得足够清楚——如果不清楚就问。

    作为最后的评论:将调试语句放入正在分配您的相关变量的代码中 - 即使您没有想到/想到它,您也可以看到正在调用 assignemnt。

    【讨论】:

    • 亲爱的投票者 - “非常感谢”您的投票。我所做的只是花费额外的时间来详细解释我发现的问题以提供帮助-如果结果与您的情况不同,请继续并投反对票....
    • 尊敬的 user387184,感谢您花时间解释问题。但是看起来您没有查看我之前对您原始帖子的评论并理解“赏金”的原因,这是不幸的。您解释的问题是订购 viewWillAppear/viewDidLoad - 它没有更接近 UIPicker 问题(这是这个问题的核心)。因此,我不赞成您的回答。但非常感谢您花时间解释流程。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-27
    • 1970-01-01
    • 2013-01-29
    • 2014-05-28
    • 1970-01-01
    • 2011-10-24
    相关资源
    最近更新 更多