18

古いバージョンのXCodeで正常に機能したコードを使用して、アプリがUIPickerViewの最後の行を自動的に事前選択できないことを診断しようとして、壁に頭をぶつけてきました。iOS 6デバイスで実行されている古いアプリは正しく動作するため、これはiOS 6ではなくXcodeのバグだと思いますが、Xcode4.5.2でコードを再コンパイルしても正しく動作しません。問題を示すために次のサンプルをまとめましたが、バグレポートを送信する前に、このフォーラムの他の人からの意見で、問題が私のコードにあるのか、実際にXcode/iOSのバグであるのかを判断してください。

単一のビューアプリを作成し、ナビゲーションコントローラーと2つのIBOutletを使用してストーリーボードをセットアップしました。1つは選択した行を表示するUILabelに、もう1つはUIPickerViewに設定します。

カスタムViewControllerのヘッダーファイルは次のとおりです。

#import <UIKit/UIKit.h>

@interface DisposableViewController : UIViewController
    <UIPickerViewDataSource, UIPickerViewDelegate>
@end

これが私のカスタムViewControllerの実装ファイルです。

#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を選択しました。これはバグだと思いますが、この問題を解決する方法について他の意見や提案をお願いします。ご清聴ありがとうございました。

4

2 に答える 2

12

このバグは、ストーリーボードの Use Autolayout オプションが原因で発生しますが、自動レイアウトを引き続き使用できる回避策を見つけました。

viewWillAppear: ではなくビュー コントローラーの viewDidAppear: で [pickerView selectRow:inComponent:] メソッドを呼び出すと、UIPickerView は正しい行を選択するように正しく調整されますが、ピッカーが間違った方向から回転するため、選択が一時的に表示されます。正しいものに選択します。

于 2012-11-15T03:16:08.187 に答える
2

iOS 6 の新しい自動レイアウト機能に関連するバグのようです。私は同じことを経験していましたが、iOS 5.1 で発生したかどうかを確認しようとすると、動作するようになったことに気付きました。

これを試してください: 問題のストーリーボードまたは nib ファイルで、 auto-layoutをオフにします。

于 2012-11-13T21:23:57.417 に答える