我一直在努力诊断我的应用程序无法使用先前版本的XCode成功工作的代码自动预选UIPickerView的最后一行。我认为这是Xcode的错误,而不是iOS 6的问题,因为我的旧应用程序在iOS 6设备上运行正常,但在Xcode 4.5.2下重新编译代码时行为不正常。我制作了以下示例以演示问题,但在提交错误报告之前,我想听听论坛上其他人的意见,以确定问题是否出在我的代码中,还是确实是Xcode / iOS的错误。
我创建了一个单视图应用程序,并使用导航控制器和两个IBOutlets设置了故事板,一个用于显示所选行的UILabel,另一个用于UIPickerView。
这是我的自定义视图控制器的头文件:
#import <UIKit/UIKit.h>
@interface DisposableViewController : UIViewController
<UIPickerViewDataSource, UIPickerViewDelegate>
@end
这是我自定义视图控制器的实现文件:
#import "DisposableViewController.h"
const NSInteger MAX_VALUE = 10;
@interface DisposableViewController ()
@property (weak, nonatomic) IBOutlet UIPickerView *pickerView;
@property (weak, nonatomic) IBOutlet UILabel *selectedValueLabel;
@end
@implementation DisposableViewController
- (void)viewDidLoad
{
[super viewDidLoad];
}
- (void)viewWillAppear:(BOOL)animated
{
[self.pickerView reloadAllComponents];
[self.pickerView selectRow:MAX_VALUE inComponent:0 animated:NO];
self.selectedValueLabel.text = [NSString stringWithFormat:@"%d", [self.pickerView selectedRowInComponent:0]];
}
//**
//** UIPickerViewDataSource methods
//**
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
{
return 1;
}
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
return MAX_VALUE + 1;
}
//**
//** UIPickerViewDelegate methods
//**
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
return [NSString stringWithFormat:@"%d", row];
}
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{
self.selectedValueLabel.text = [NSString stringWithFormat:@"%d", row];
}
@end
这里是一个展示问题的截图:
请注意,我的代码尝试在viewWillAppear:方法中自动选择UIPickerView中的最后一行,但是当程序运行时,当调用[self.pickerView selectedRowInComponent:0]时,值标签显示的行号为10,但UIPickerView本身在视觉上显示已经选择了第9行。我认为这是个bug,但希望得到其他意见或解决此问题的建议。谢谢您的关注。