iOS5中UIPickerView selectRow InComponent的不同奇怪行为

时间:2011-10-22 20:57:00

标签: iphone ios ios5 sms uipickerview

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的值是可以的。 现在我只是打电话给正常的短信对话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之前,没有任何问题。

有什么我错过的吗?

非常感谢

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:-1)

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

起始屏幕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对话框启动画面需要在那里。

希望我能够很好地解释清楚 - 只要问一下它是否不清楚。

作为最后一条评论:将调试语句放入代码中你的变量被分配的代码 - 你可以看到即使你没有想到/想到它也会被调用。