UIPickerView在Xcode 4.5.2和iOS 6下编译时无法自动选择最后一行。

18

我一直在努力诊断我的应用程序无法使用先前版本的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,但希望得到其他意见或解决此问题的建议。谢谢您的关注。


1
我也遇到了同样的问题。我的应用程序可以处理除最后一行之外的所有行。 - Steven Striga
2
这个问题已经解决了吗?我在最新版本的Xcode中遇到了同样的问题。有什么办法可以解决吗?谢谢。 - Bassel
寻找一个解决方案,可以在不使用viewDidAppear的情况下实现AutoLayout。 - user246672
2个回答

12

这个 bug 是由于 storyboard 中的“使用自动布局”选项引起的,但我已经找到了一种解决方法,可以让我继续使用自动布局:

如果我在视图控制器的 viewDidAppear: 方法中调用 [pickerView selectRow:inComponent:] 方法,而不是在 viewWillAppear: 方法中调用,则 UIPickerView 将正确地调整以选择正确的行,尽管在选择器从错误的选择旋转到正确的选择时,选择瞬间可见。


1
这是我走过的路,但当选择器出现在屏幕上时会有一点闪烁。我的一个朋友建议在viewWillAppear中向选择器添加一个额外的空行,然后预先选择所需的行,在viewDidAppear中将其删除。听起来这样可以避免闪烁,但我要等到WWDC结束后再看看苹果是否发布了修复问题的新Xcode,然后再尝试它... - Matt Gibson
@MattGibson 谢谢。你朋友的方法非常有效。https://gist.github.com/6433934 - user246672
你太棒了。(我为这个问题几乎撞墙。这只是一个苹果UIKit的bug。呃!)谢谢。投票+1。 - DerWOK

2

这明显是iOS 6中与新的自动布局功能相关的一个bug。我也遇到了同样的问题,但当我试图查看它是否在iOS 5.1中发生时,我注意到它开始工作了。

尝试这个:在涉及到的storyboard或nib文件中关闭自动布局


1
我刚刚确认在我的故事板中取消“使用自动布局”选项后,我的程序现在能够自动选择UIPickerView中的最后一行。感谢你的帮助,我会提交一个错误报告。 - user1819329

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接