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);
}
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
これにより、選択した行がピッカーから整数として取得され、必要に応じて実行されます。これはyahに役立つはずです。幸運を。
とにかく参照を読む: 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)
optionクリックXcodeの.selectRowは以下を表示します:
これは、UIPickerViewのデフォルト値を設定する方法です
[self.picker selectRow:4 inComponent:0 animated:YES];
アウトレットを定義します。
@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は次を表示します。
私もこの問題を抱えていました。しかし、どうやらメソッド呼び出しの順序の問題があります。あなたが呼び出す必要があります:
[self.picker selectRow:2 inComponent:0 animated:YES];
後呼び出し
[self.view addSubview:self.picker];
- (void)selectRow:(NSInteger)row inComponent:(NSInteger)component animated:(BOOL)animated
が表示される前に、ピッカービューに送信する必要があります。ドキュメントには、メソッドselectedRowInComp ...が-1を与えると記載されているため、ピッカービューは行が選択されていない状態になっている可能性があります。作成されると、その状態になります。
通常の場合、viewDidLoad method;でこのようなことができます。
[_picker selectRow:1 inComponent:0 animated:YES];
私の場合、APIサーバーからデータを取得してUIPickerView
に表示したいので、ピッカーがデフォルトでfirst
アイテムを選択するようにします。
UIPickerViewはlike like作成後最初のアイテムを選択しますが、selectedRowInComponent
を使用して選択したインデックスを取得しようとすると、NSNull
を取得します。これは、ユーザーが何も検出しなかったためです変更(0から0を選択)。
以下は私のソリューションです(データを取得した後のviewWillAppearで)
[_picker selectRow:1 inComponent:0 animated:NO];
[_picker selectRow:0 inComponent:0 animated:NO];
少し汚いですが、心配しないでください、iOSでのUIレンダリングは非常に高速です;)
For example: you populated your UIPickerView with array values, then you wanted
「Arizona」のような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];