66

UIPickerView に問題があります。EU AP と NA の 3 つの値があります。アプリを起動すると EU が選択されているように見えますが、作成するNSLog(@"%@", [regions objectAtIndex:row]);と戻るだけで(null)、UIPickerView に触れると EU 値が選択さ"EU"れ、NSLog から戻ります。

私の質問は:

ユーザーがアプリを起動しただけで何も触れていないときに (ラベルだけでなく) 選択されるデフォルト値を定義するにはどうすればよいですか。

編集:選択したアイテムを取得するためのコードは次のとおりです。

#pragma mark -
#pragma mark PickerView DataSource

- (NSInteger)numberOfComponentsInPickerView:
(UIPickerView *)pickerView
{
    return 1;
}
- (NSInteger)pickerView:(UIPickerView *)pickerView
numberOfRowsInComponent:(NSInteger)component
{
    return [regions count];
}
- (NSString *)pickerView:(UIPickerView *)pickerView
             titleForRow:(NSInteger)row
            forComponent:(NSInteger)component
{
    return [regions objectAtIndex:row];
}

#pragma mark -
#pragma mark PickerView Delegate
-(void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row
      inComponent:(NSInteger)component
{

                selectedRegion = [[NSString alloc] initWithFormat:
                              @"%@", [regions objectAtIndex:row]];
    NSLog(@"%@", selectedRegion);


}
4

7 に答える 7

107

TL:DR バージョン:

//Objective-C
[self.picker selectRow:2 inComponent:0 animated:YES];
//Swift
picker.selectRow(2, inComponent:0, animated:true)

行を選択するようにピッカーを設定しなかったかのいずれかです(とにかく行ったようですが):

- (void)selectRow:(NSInteger)row inComponent:(NSInteger)component animated:(BOOL)animated

または、ピッカーから選択した項目を取得するために次の方法を使用しなかった

- (NSInteger)selectedRowInComponent:(NSInteger)component

これにより、選択した行がピッカーから整数として取得され、好きなように処理されます。これでうまくいくはずです。幸運を。

とにかく参照を読んでください: https://developer.apple.com/documentation/uikit/uipickerview


編集:

UIPickerView で選択した行を手動で設定および取得する例:

.h ファイル:

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController <UIPickerViewDelegate, UIPickerViewDataSource>
{
    UIPickerView *picker;
    NSMutableArray *source;
}

@property (nonatomic,retain) UIPickerView *picker;
@property (nonatomic,retain) NSMutableArray *source;

-(void)pressed;

@end

.m ファイル:

#import "ViewController.h"

@interface ViewController ()

@end
@implementation ViewController

@synthesize picker;
@synthesize source;

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
}

- (void)viewDidUnload
{
    [super viewDidUnload];
    // Release any retained subviews of the main view.
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return YES;
}

- (void) viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];

    self.view.backgroundColor = [UIColor yellowColor];

    self.source = [[NSMutableArray alloc] initWithObjects:@"EU", @"USA", @"ASIA", nil];

    UIButton *pressme = [[UIButton alloc] initWithFrame:CGRectMake(20, 20, 280, 80)];
    [pressme setTitle:@"Press me!!!" forState:UIControlStateNormal];
    pressme.backgroundColor = [UIColor lightGrayColor];
    [pressme addTarget:self action:@selector(pressed) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:pressme];

    self.picker = [[UIPickerView alloc] initWithFrame:CGRectMake(20, 110, 280, 300)];
    self.picker.delegate = self;
    self.picker.dataSource = self;
    [self.view addSubview:self.picker];

    //This is how you manually SET(!!) a selection!
    [self.picker selectRow:2 inComponent:0 animated:YES];
}

//logs the current selection of the picker manually
-(void)pressed
{
    //This is how you manually GET(!!) a selection
    int row = [self.picker selectedRowInComponent:0];

    NSLog(@"%@", [source objectAtIndex:row]);
}

- (NSInteger)numberOfComponentsInPickerView:
(UIPickerView *)pickerView
{
    return 1;
}

- (NSInteger)pickerView:(UIPickerView *)pickerView
numberOfRowsInComponent:(NSInteger)component
{
    return [source count];
}

- (NSString *)pickerView:(UIPickerView *)pickerView
             titleForRow:(NSInteger)row
            forComponent:(NSInteger)component
{
    return [source objectAtIndex:row];
}

#pragma mark -
#pragma mark PickerView Delegate
-(void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row
      inComponent:(NSInteger)component
{
//    NSLog(@"%@", [source objectAtIndex:row]);
}

@end

Swift ソリューションの編集 (出典: Dan Beaulieu の回答)

アウトレットを定義します。

@IBOutlet weak var pickerView: UIPickerView!  // for example

次に、たとえば、 viewWillAppearまたはviewDidLoadで、次を使用できます。

pickerView.selectRow(rowMin, inComponent: 0, animated: true)
pickerView.selectRow(rowSec, inComponent: 1, animated: true)

Swift 2.0 フレームワークを調べると、.selectRow が次のように定義されていることがわかります。

func selectRow(row: Int, inComponent component: Int, animated: Bool) 

オプションXcode で .selectRow をクリックすると、次のように表示されます。

于 2012-08-02T12:17:34.160 に答える
18

これはUIPickerViewのデフォルト値を設定する方法です

[self.picker selectRow:4 inComponent:0 animated:YES];
于 2014-02-07T06:10:38.063 に答える
11

迅速な解決策:

アウトレットを定義します。

@IBOutlet weak var pickerView: UIPickerView!  // for example

次に、たとえば、 viewWillAppearまたはviewDidLoadで、次を使用できます。

pickerView.selectRow(rowMin, inComponent: 0, animated: true)
pickerView.selectRow(rowSec, inComponent: 1, animated: true)

.selectRowSwift 2.0 フレームワークを調べると、次のように定義されていることがわかります。

func selectRow(row: Int, inComponent component: Int, animated: Bool) 

オプションXcode で .selectRow をクリックすると、次のように表示されます。

ここに画像の説明を入力

于 2015-07-02T18:40:53.073 に答える
4

- (void)selectRow:(NSInteger)row inComponent:(NSInteger)component animated:(BOOL)animated 表示される前に、ピッカー ビューに送信 する必要があります。ドキュメントには、selectedRowInComp... メソッドが -1 を与えると記載されているため、ピッカー ビューが行が選択されていない状態である可能性があります。作成時にはその状態であることがわかります。

于 2012-08-02T12:34:18.283 に答える
1
For example: you populated your UIPickerView with array values, then you wanted 

「アリゾナ」のような pickerView の最初のロードで特定の配列値を選択します。「アリゾナ」という単語がインデックス 2 にあることに注意してください。

NSArray *countryArray =[NSArray arrayWithObjects:@"Alabama",@"Alaska",@"Arizona",@"Arkansas", nil];
UIPickerView *countryPicker=[[UIPickerView alloc]initWithFrame:self.view.bounds];
countryPicker.delegate=self;
countryPicker.dataSource=self;
[countryPicker selectRow:2 inComponent:0 animated:YES];
[self.view addSubview:countryPicker];
于 2015-12-19T02:51:20.530 に答える
1

通常、 viewDidLoadメソッドで次のようなことができます。

[_picker selectRow:1 inComponent:0 アニメーション:YES];

私の場合、APIサーバーからデータを取得して表示しUIPickerViewたいのですが、ピッカーがfirstデフォルトでアイテムを選択するようにします。

UIPickerView は、作成後に最初の項目を選択したように見えますが、 を使用して選択されたインデックスを取得しようとすると、 が取得されselectedRowInComponentますNSNull。これは、ユーザーによる変更が何も検出されなかったためです(select 0 from 0 )。

以下は私の解決策です(データをフェッチした後、viewWillAppearで)

[_picker selectRow:1 inComponent:0 animated:NO];
[_picker selectRow:0 inComponent:0 animated:NO];

少し汚れていますが、心配しないでください。iOS での UI レンダリングは非常に高速です ;)

于 2014-11-21T09:45:43.607 に答える