Pickers(5)~DoubleComponentPicker

2010. 10. 06
次は3つ目のビューとなる、独立したホイールが二つのピッカーを作成します。

790

前回のSingleComponentPickerと同様に、ホイールの要素はソースコード内に文字列の配列として記述します。


●サンプルコードについて

Apress社のサイト内のサンプルコードにおいて、DoubleComponentPickerで『Order』ボタンをタップするとアプリケーションが強制終了してしまいます。

これはDoubleComponentPickerView.xibにおいて、buttonPressedアクションメソッドのリンクが切れているためです。

838

リンク切れを起こしているものを『×』をクリックして削除し、有効なbuttonPressedをRound Rect Buttonに接続すると正常に動作します。

839

840


●ヘッダファイルの編集

DoubleComponentPickerView.hを開き、ピッカーから値を取得するためのアウトレットとプロパティ、2つのピッカーに並べる文字列を入れる配列とプロパティ、ピッカーから取得した値をアラートで表示するためのアクションを宣言します。
(太字が追加した部分)

#import <UIKit/UIKit.h>

#define kWitchComponent 0
#define kStrikerUnitComponent 1


@interface DoubleComponentPickerViewController : UIViewController <UIPickerViewDelegate, UIPickerViewDataSource> {
    UIPickerView *doublePicker;
    NSArray *witches;
    NSArray *strikerUnits;

}

@property (nonatomic, retain) IBOutlet UIPickerView *doublePicker;
@property (nonatomic, retain) NSArray *witches;
@property (nonatomic, retain) NSArray *strikerUnits;

- (IBAction)buttonPressed;


@end

841

変数名を変更していますが、内容は変えていません。

コンポーネントが2つあるので、それ用の配列が2つになっている以外はSingleComponentPickerとほぼ同じです。

#defineで宣言している2つの定数は、どちらのコンポーネントを指すかを示すものです。


●nibファイルの編集

nibファイルDoubleComponentPickerView.xibは変数名が異なるだけで、SingleComponentPickerのものと同じです。

コンポーネント数が増えるだけの場合、ソースコードの処理が異なるだけで、nibファイルは影響されません。

842


●ソースファイルの編集

ソースコードもSingleComponentPickerとほぼ同じ内容ですが、

・buttonPressedアクションメソッドで、アラート表示用に文字列を取得する処理
・viewDidLoadメソッドでコンポーネント用の文字列配列を生成する処理
・データソース・デリゲートメソッドの処理

が異なります。

ソースコードでもサンプルコードとは変数名等を変更していますが、内容は変えていません。

DoubleComponentPickerViewController.mを開き、doublePickerプロパティとbuttonPressedアクション、ピッカーのデリゲートとデータソースの実装を行います。
(太字が追加・変更した部分)

#import "DoubleComponentPickerViewController.h"

@implementation DoubleComponentPickerViewController

@synthesize doublePicker;
@synthesize witches;
@synthesize strikerUnits;

- (IBAction)buttonPressed {
    NSInteger witchRow = [doublePicker selectedRowInComponent:kWitchComponent];
    NSInteger strikerUnitRow = [doublePicker selectedRowInComponent:kStrikerUnitComponent];

    NSString *witch = [witches objectAtIndex:witchRow];
    NSString *strikerUnit = [strikerUnits objectAtIndex:strikerUnitRow];
    NSString *message = [[NSString alloc] initWithFormat:@"%@ with %@ will be right up.", witch, strikerUnit];
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Thank you for your order" message:message delegate:nil cancelButtonTitle:@"Great!" otherButtonTitles:nil];
    [alert show];
    [alert release];
    [message release];
}


// The designated initializer. Override if you create the controller programmatically and want to perform customization that is not appropriate for viewDidLoad.
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
    if ((self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil])) {

        // Custom initialization
    }
    return self;
}


/*
// Implement loadView to create a view hierarchy programmatically, without using a nib.
- (void)loadView {
}
*/


// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad {
    [super viewDidLoad];
    NSArray *witchArray = [[NSArray alloc] initWithObjects:@"Yoshika", @"Mio", @"Minna",
        @"Lynette", @"Perrine", @"Erica", @"Gertrud", @"Francesca", @"Charlotte", @"Eila",
        @"Sanya", nil];
    self.witches = witchArray;
    [witchArray release];
    NSArray *strikerUnitArray = [[NSArray alloc] initWithObjects:@"A6M3a", @"Bf109G-2",
        @"Spitfire Mk.IX", @"VG39", @"Bf109G-6", @"Fw190D-6", @"G55 Centauro", @"P-51D",
        @"Bf109G-2", @"MiG60", nil];
    self.strikerUnits = strikerUnitArray;
    [strikerUnitArray release];
}


// Override to allow orientations other than the default portrait orientation.
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    // Return YES for supported orientations
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}


- (void)didReceiveMemoryWarning {
    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];

    // Release any cached data, images, etc that aren't in use.
}

- (void)viewDidUnload {
    [super viewDidUnload];
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;

}

- (void)dealloc {
    [doublePicker release];
    [witches release];
    [strikerUnits release];

    [super dealloc];
}

#pragma mark -
#pragma mark Picker Data Source Methods

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

- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component {
    if (component == kWitchComponent)
        return [self.witches count];
    return [self.strikerUnits count];
}

#pragma mark Picker Delegate Methods

- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component {
    if (component == kWitchComponent)
        return [self.witches objectAtIndex:row];
    return [self.strikerUnits objectAtIndex:row];
}


@end

843

宣言していたアウトレットのdoublePickerと、コンポーネントのデータ用のwitches、strikerUnitsプロパティを実装し、deallocで解放を行っています。

アクションメソッドbuttonPressedは、ピッカーで選択されている行インデックスをselectedRowInComponent:メソッドで各コンポーネント毎に取得し、文字列の配列からobjectAtIndex:メソッドでインデックス番号を指定して要素を取り出し、アラートで表示しています。

コメントアウトされている、initWithNibName:bundle:、viewDidLoad、shouldAutorotateToInterfaceOrientation:メソッドを有効にします。

initWithNibName:bundle:とshouldAutorotateToInterfaceOrientation:の両メソッドは有効にしただけで、追加などは行っていません。

viewDidLoadメソッドはアプリケーションの起動時にピッカーの要素となる文字列の配列を生成し、pickerDataプロパティに入れた後、生成した配列の解放を行っています。

各コンポーネント用に配列を2つ分用意しているだけで、特別なことはしていません。

データソースメソッドのnumberOfComponentsInPickerView:は、コンポーネント数である2を返しています。

データソースメソッドのpickerView:numberOfRowsInComponent:はコンポーネントの行数、デリゲートメソッドのpickerView:titleForRow:forComponent:は指定したコンポーネントと行番号から要素となる文字列を返すメソッドなので、コンポーネントの定数で条件分岐して各コンポーネントの値を返すようになっています。

844



参考文献

はじめてのiPhone3プログラミングはじめてのiPhone3プログラミング
(2009/12/17)
Dave Mark、Jeff LaMarche 他

商品詳細を見る






Wave SoundTouch music system IV
0 Comments
Leave a comment
管理者にだけ表示を許可する
Top
0 Trackbacks
Top
Calendar
06 | 2017/07 | 08
Sun Mon Tue Wed Thu Fri Sat
- - - - - - 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 - - - - -
Recent Articles
iTunes


Swift
Categories
Tips
Profile

水月杏香

Author:水月杏香
永遠の初心者プログラマ。

Wish List
WACOM


ARC
Technical Q&A
情報プロパティリストキー
Start Developing iOS Apps Today
BOSE

Wave SoundTouch music system IV
Reference
NSApplicationDelegateプロトコル
NSArrayクラス
NSAutoreleasePoolクラス
NSBundleクラス
NSBundle UIKit追加分
NSCalendarクラス
NSCoderクラス
NSCodingプロトコル
NSCopyingプロトコル
NSDataクラス
NSDateクラス
NSDateFormatterクラス
NSDictionaryクラス
NSEntityDescriptionクラス
NSEnumeratorクラス
NSErrorクラス
NSExceptionクラス
NSFetchRequestクラス
NSFileHandleクラス
NSFileManagerクラス
NSIndexPathクラス
NSIndexPath UIKit追加分
NSKeyedArchiverクラス
NSKeyedUnarchiverクラス
NSKeyValueCodingプロトコル
NSLocaleクラス
NSManagedObjectクラス
NSManagedObjectContextクラス
NSManagedObjectModelクラス
NSMutableArrayクラス
NSMutableCopyingプロトコル
NSMutableDictionaryクラス
NSMutableSetクラス
NSNotificationクラス
NSNotificationCenterクラス
NSNullクラス
NSNumberクラス
NSObjectクラス
NSObject UIKit追加分
NSObjectプロトコル
NSPersistentStoreクラス
NSPersistentStoreCoordinatorクラス
NSPredicateクラス
NSPropertyListSerializationクラス
NSRunLoopクラス
NSSetクラス
NSStringクラス
NSString UIKit追加分
NSTimerクラス
NSTimeZoneクラス
NSURLクラス
NSURLProtectionSpaceクラス
NSURLRequestクラス
NSUserDefaultsクラス
NSValueクラス

UIActionSheetクラス
UIActionSheetDelegateプロトコル
UIActivityIndicatorViewクラス
UIAlertViewクラス
UIAlertViewDelegateプロトコル
UIApplicationクラス
UIApplicationDelegateプロトコル
UIBarButtonItemクラス
UIBarItemクラス
UIButtonクラス
UIColorクラス
UIControlクラス
UIDatePickerクラス
UIDeviceクラス
UIEventクラス
UIFontクラス
UIGestureRecognizerクラス
UIImageクラス
UIImageViewクラス
UIKit Function
UILabelクラス
UINavigationControllerクラス
UINavigationItemクラス
UIPickerViewクラス
UIPickerViewDataSourceプロトコル
UIPickerViewDelegateプロトコル
UIPinchGestureRecognizerクラス
UIResponderクラス
UIScreenクラス
UIScrollViewクラス
UISearchBarクラス
UISearchBarDelegateプロトコル
UISegmentedControlクラス
UISliderクラス
UISwipeGestureRecognizerクラス
UISwitchクラス
UITableViewクラス
UITableViewCellクラス
UITableViewControllerクラス
UITableViewDataSourceプロトコル
UITableViewDelegateプロトコル
UITapGestureRecognizerクラス
UITextFieldクラス
UITextFieldDelegateプロトコル
UITextInputTraitsプロトコル
UITextViewクラス
UITextViewDelegateプロトコル
UIToolbarクラス
UITouchクラス
UIViewクラス
UIViewControllerクラス
UIWebViewクラス
UIWebViewDelegateプロトコル
UIWindowクラス

AVAudioPlayerクラス
AVAudioPlayerDelegateプロトコル

CADisplayLinkクラス
CAEAGLLayerクラス
CALayerクラス

CGAffineTransform
CGBitmapContext
CGColor
CGColorSpace
CGContext
CGGeometry
CGImage
CGPath

EAGLContextクラス
EAGLDrawableプロトコル

Foundation Constants
Foundation Data Types
Foundation Functions

MPMediaItemクラス
MPMediaItemArtworkクラス
MPMediaPlaylistクラス
MPMediaPropertyPredicateクラス
MPMediaQueryクラス
MPMusicPlayerControllerクラス

Randomization Services

System Sound Services
Amazon


OpenGL ES
SQLite
Monthly Archives
Recent Comments
Recent TrackBacks
RSS Link
Visitors
QR Code
QR