AppSettings(9)~FlipsideViewController
2011. 01. 31
最後に裏面となるフリップサイドビューの設定を行います。

フリップサイドビューはメインビューのインフォメーションボタンをタップすると表示され、スイッチとスライダの設定を行うことができます。
ここでの設定はメインビューだけでなく、Settingsアプリケーションの設定にも反映されます。
ナビゲーションバー左側にあるDoneボタンをタップするとメインビューに戻ります。
●フリップサイドビューコントローラのヘッダファイルFlipsideViewController.hの編集
Settings.bundleからプリファレンス値の読み込みと変更を反映させるため、スイッチとスライダのアウトレットとなるプロパティと、ナビゲーションバーのDoneボタン用のアクションメソッドを宣言します。
(太字が追加した部分)

最初の@protocolはFlipsideViewControllerDelegateプロトコルの前方宣言で、FlipsideViewControllerDelegateという文字列がプロトコルであることをコンパイラに指示しているものです。
この前方宣言は、インスタンス変数delegateがFlipsideViewControllerDelegateプロトコルに適合するという型宣言のために行っています。
最後の方にある@protocolはFlipsideViewControllerDelegateプロトコルの宣言で、(MainViewControllerで実装している)flipsideViewControllerDidFinish:メソッドを宣言しています。
アクションメソッドdone:も含めて、太字以外はUtility Applicationテンプレートで自動生成されます。
太字で示しているスイッチとスライダのアウトレットが追加した部分です。
●フリップサイドビューのnibファイルFlipsideView.xibの編集
Resources下のFlipsideView.xibをダブルクリックし、Interface Builderで開きます。
デフォルトのフリップサイドビューは、背景色がダークグレーになっています。

DocumentウィンドウでViewを選択し、InspectorウィンドウのAttributesタブで、ViewのBackgroundをLight Gray Colorに変更します。


次にラベル2つとスイッチとスライダを設置します。
スイッチ用のラベルのテキストは『StrikerUnit』、スライダ用のテキストは『Breasts』とします。
スライダについてはInspectorウィンドウのAttributesタブで、最小値/最大値/初期値をそれぞれ60.00/100.00/80.00に、最小値/最大値の画像をそれぞれturtle.pngとrabbit.pngに設定します。


最後にアウトレットを接続します。
DocumentウィンドウでFile's Ownerを選択し、InspectorウィンドウのConnectionsタブでスライダbreastsSliderとスイッチstrikerUnitSwitchを接続します。
(自動生成されるアクションメソッドdone:は、何も変更していなければ接続済みになっています)

●フリップサイドビューコントローラのソースファイルFlipsideViewController.mの編集
Settings.bundleからプリファレンス値の読み込みと変更を反映させるため、スイッチとスライダのアウトレットとなるプロパティと、ナビゲーションバーのDoneボタン用のアクションメソッドを宣言します。
(太字が追加・修正した部分)

1)MainViewController.hのインポート
Settingsアプリケーションのデフォルトオブジェクトから値を取得する際に使うキーのため、MainViewController.hをインポートします。
2)プロパティの実装
ヘッダファイルで宣言したプロパティ、スイッチのstrikerUnitSwitchとスライダのbreastsSliderを実装します。
(delegateは自動生成で実装済みです)
3)viewDidLoadの編集
viewDidLoadでは、Settingsアプリケーションのデフォルトオブジェクトからスイッチとスライダの設定値を取得し、アウトレットに反映させます。
最初に自動生成されているビューの背景色の設定をコメントアウトします。
これはviewFlipsideBackgroundColorメソッドでビューの裏面の色をbackgroundColorに設定しているのですが、今回はInterface Builderで背景色をLight Gray Colorに設定していますので不要になります。
次にSettingsアプリケーションのデフォルトオブジェクトを、NSUserDefaultsクラスのstandardUserDefaultsメソッドで取得します。
取得したインスタンスdefaultsから、インポートしたヘッダファイルMainViewController.hで設定したキー定数を使い、スイッチとスライダの値を設定します。
スイッチは、objectForKey:メソッドで取得される値は独自に設定した文字列ですので、onプロパティでスイッチのON/OFFをさせるために、isEqualToString:メソッドで文字列を判定し、YES/NOに置換して設定しています。
スライダは、floatForKey:メソッドで実数値を取得し、valueプロパティで設定しています。
・viewFlipsideBackgroundColor
+ (UIColor *)viewFlipsideBackgroundColor
反転している間のビューの裏面で使用されるシステムカラーを返します。
戻り値はUIColorオブジェクトです。
・floatForKey:
- (float)floatForKey:(NSString *)defaultName
指定したキーに関連付けされている浮動小数点値を返します。
戻り値は指定したキーに関連付けされている浮動小数点値で、指定したキーが存在しない場合には0を返します。
defaultName:現在のユーザのデフォルトデータベース内のキーを指定します。
4)viewWillDisappear:の追加
viewWillDisappear:メソッドは、フリップサイドビューが非表示になる際に呼び出されるメソッドで、ここではフリップサイドビューで設定されたスイッチとスライダの値をSettingsアプリケーションのデフォルトオブジェクトに書き戻す処理を行っています。
最初にSettingsアプリケーションのデフォルトオブジェクトを、NSUserDefaultsクラスのstandardUserDefaultsメソッドで取得します。
スイッチは独自の文字列で設定されるので、onプロパティで得たON/OFFの状態を文字列に置換し、setObject:forKey:メソッドで設定します。
スライダはsetFloat:forKey:メソッドで設定します。
・setFloat:forKey:
- (void)setFloat:(float)value forKey:(NSString *)defaultName
指定した浮動小数点値を対応するキーを指定してデフォルトに設定します。
setObject:forKeyの機能の一部として呼び出します。
value:デフォルトのデータベースへ設定する浮動小数点値を指定します。
defaultName:浮動小数点値に対応するキーを設定します。
5)done:メソッドについて
done:メソッドは、Utility Applicationテンプレートで自動生成され、フリップサイドビューのナビゲーションバー左側にあるDoneボタンをタップした際に呼び出されるアクションメソッドです。
デリゲートに対し、flipsideViewControllerDidFinish:メソッドで自身(FlipsideViewController)を渡しています。
6)viewDidUnloadの実装
本書ではviewDidUnloadは記述されていませんが、サンプルコードのように2つのプロパティの所有権放棄を行います。
スーパークラスによる初期化は、最初に行っています。
7)shouldAutorotateToInterfaceOrientation:の実装
本書では太字で示されておらず、サンプルコードではコメントアウトされていますが、shouldAutorotateToInterfaceOrientation:のコメントアウトを解除してデフォルトの状態(ポートレートのみ有効)で実装しています。
8)deallocの実装
deallocでは本書やサンプルコードと同じく、2つのプロパティの解放を行っています。
●実行
『ビルドと実行』を行うと、アプリケーションのフリップサイドビューは下図のような表示になります。

ここで設定したスイッチやスライダの値はメインビューだけでなく、Settingsアプリケーションにも反映されます。


参考文献
・UIColor Class Reference
・NSUserDefaults Class Reference

フリップサイドビューはメインビューのインフォメーションボタンをタップすると表示され、スイッチとスライダの設定を行うことができます。
ここでの設定はメインビューだけでなく、Settingsアプリケーションの設定にも反映されます。
ナビゲーションバー左側にあるDoneボタンをタップするとメインビューに戻ります。
●フリップサイドビューコントローラのヘッダファイルFlipsideViewController.hの編集
Settings.bundleからプリファレンス値の読み込みと変更を反映させるため、スイッチとスライダのアウトレットとなるプロパティと、ナビゲーションバーのDoneボタン用のアクションメソッドを宣言します。
(太字が追加した部分)
#import <UIKit/UIKit.h>
@protocol FlipsideViewControllerDelegate;
@interface FlipsideViewController : UIViewController {
id <FlipsideViewControllerDelegate> delegate;
UISwitch *strikerUnitSwitch;
UISlider *breastsSlider;
}
@property (nonatomic, assign) id <FlipsideViewControllerDelegate> delegate;
@property (nonatomic, retain) IBOutlet UISwitch *strikerUnitSwitch;
@property (nonatomic, retain) IBOutlet UISlider *breastsSlider;
- (IBAction)done:(id)sender;
@end
@protocol FlipsideViewControllerDelegate
- (void)flipsideViewControllerDidFinish:(FlipsideViewController *)controller;
@end
@protocol FlipsideViewControllerDelegate;
@interface FlipsideViewController : UIViewController {
id <FlipsideViewControllerDelegate> delegate;
UISwitch *strikerUnitSwitch;
UISlider *breastsSlider;
}
@property (nonatomic, assign) id <FlipsideViewControllerDelegate> delegate;
@property (nonatomic, retain) IBOutlet UISwitch *strikerUnitSwitch;
@property (nonatomic, retain) IBOutlet UISlider *breastsSlider;
- (IBAction)done:(id)sender;
@end
@protocol FlipsideViewControllerDelegate
- (void)flipsideViewControllerDidFinish:(FlipsideViewController *)controller;
@end

最初の@protocolはFlipsideViewControllerDelegateプロトコルの前方宣言で、FlipsideViewControllerDelegateという文字列がプロトコルであることをコンパイラに指示しているものです。
この前方宣言は、インスタンス変数delegateがFlipsideViewControllerDelegateプロトコルに適合するという型宣言のために行っています。
最後の方にある@protocolはFlipsideViewControllerDelegateプロトコルの宣言で、(MainViewControllerで実装している)flipsideViewControllerDidFinish:メソッドを宣言しています。
アクションメソッドdone:も含めて、太字以外はUtility Applicationテンプレートで自動生成されます。
太字で示しているスイッチとスライダのアウトレットが追加した部分です。
●フリップサイドビューのnibファイルFlipsideView.xibの編集
Resources下のFlipsideView.xibをダブルクリックし、Interface Builderで開きます。
デフォルトのフリップサイドビューは、背景色がダークグレーになっています。

DocumentウィンドウでViewを選択し、InspectorウィンドウのAttributesタブで、ViewのBackgroundをLight Gray Colorに変更します。


次にラベル2つとスイッチとスライダを設置します。
X: | Y: | W: | H: | |
Label (StrikerUnit) | 20 | 106 | 113 | 21 |
Label (Breasts) | 20 | 160 | 113 | 21 |
Switch | 206 | 103 | 94 | 27 |
Horizontal Slider | 18 | 189 | 284 | 23 |
スイッチ用のラベルのテキストは『StrikerUnit』、スライダ用のテキストは『Breasts』とします。
スライダについてはInspectorウィンドウのAttributesタブで、最小値/最大値/初期値をそれぞれ60.00/100.00/80.00に、最小値/最大値の画像をそれぞれturtle.pngとrabbit.pngに設定します。


最後にアウトレットを接続します。
DocumentウィンドウでFile's Ownerを選択し、InspectorウィンドウのConnectionsタブでスライダbreastsSliderとスイッチstrikerUnitSwitchを接続します。
(自動生成されるアクションメソッドdone:は、何も変更していなければ接続済みになっています)

●フリップサイドビューコントローラのソースファイルFlipsideViewController.mの編集
Settings.bundleからプリファレンス値の読み込みと変更を反映させるため、スイッチとスライダのアウトレットとなるプロパティと、ナビゲーションバーのDoneボタン用のアクションメソッドを宣言します。
(太字が追加・修正した部分)
#import "FlipsideViewController.h"
#import "MainViewController.h"
@implementation FlipsideViewController
@synthesize delegate;
@synthesize strikerUnitSwitch;
@synthesize breastsSlider;
- (void)viewDidLoad {
[super viewDidLoad];
// self.view.backgroundColor = [UIColor viewFlipsideBackgroundColor];
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
strikerUnitSwitch.on = ([[defaults objectForKey:kStrikerUnitKey] isEqualToString:@"Equipped"]) ? YES : NO;
breastsSlider.value = [defaults floatForKey:kBreastsKey];
}
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSString *prefValue = (strikerUnitSwitch.on) ? @"Equipped" : @"Released";
[defaults setObject:prefValue forKey:kStrikerUnitKey];
[defaults setFloat:breastsSlider.value forKey:kBreastsKey];
}
- (IBAction)done:(id)sender {
[self.delegate flipsideViewControllerDidFinish:self];
}
- (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 {
// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
[super viewDidUnload];
self.strikerUnitSwitch = nil;
self.breastsSlider = nil;
}
// Override to allow orientations other than the default portrait orientation.
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
// Return YES for supported orientations
return (interfaceOrientation == UIInterfaceOrientationPortrait);
}
- (void)dealloc {
[strikerUnitSwitch release];
[breastsSlider release];
[super dealloc];
}
@end
#import "MainViewController.h"
@implementation FlipsideViewController
@synthesize delegate;
@synthesize strikerUnitSwitch;
@synthesize breastsSlider;
- (void)viewDidLoad {
[super viewDidLoad];
// self.view.backgroundColor = [UIColor viewFlipsideBackgroundColor];
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
strikerUnitSwitch.on = ([[defaults objectForKey:kStrikerUnitKey] isEqualToString:@"Equipped"]) ? YES : NO;
breastsSlider.value = [defaults floatForKey:kBreastsKey];
}
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSString *prefValue = (strikerUnitSwitch.on) ? @"Equipped" : @"Released";
[defaults setObject:prefValue forKey:kStrikerUnitKey];
[defaults setFloat:breastsSlider.value forKey:kBreastsKey];
}
- (IBAction)done:(id)sender {
[self.delegate flipsideViewControllerDidFinish:self];
}
- (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 {
// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
[super viewDidUnload];
self.strikerUnitSwitch = nil;
self.breastsSlider = nil;
}
// Override to allow orientations other than the default portrait orientation.
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
// Return YES for supported orientations
return (interfaceOrientation == UIInterfaceOrientationPortrait);
}
- (void)dealloc {
[strikerUnitSwitch release];
[breastsSlider release];
[super dealloc];
}
@end

1)MainViewController.hのインポート
Settingsアプリケーションのデフォルトオブジェクトから値を取得する際に使うキーのため、MainViewController.hをインポートします。
2)プロパティの実装
ヘッダファイルで宣言したプロパティ、スイッチのstrikerUnitSwitchとスライダのbreastsSliderを実装します。
(delegateは自動生成で実装済みです)
3)viewDidLoadの編集
viewDidLoadでは、Settingsアプリケーションのデフォルトオブジェクトからスイッチとスライダの設定値を取得し、アウトレットに反映させます。
最初に自動生成されているビューの背景色の設定をコメントアウトします。
これはviewFlipsideBackgroundColorメソッドでビューの裏面の色をbackgroundColorに設定しているのですが、今回はInterface Builderで背景色をLight Gray Colorに設定していますので不要になります。
次にSettingsアプリケーションのデフォルトオブジェクトを、NSUserDefaultsクラスのstandardUserDefaultsメソッドで取得します。
取得したインスタンスdefaultsから、インポートしたヘッダファイルMainViewController.hで設定したキー定数を使い、スイッチとスライダの値を設定します。
スイッチは、objectForKey:メソッドで取得される値は独自に設定した文字列ですので、onプロパティでスイッチのON/OFFをさせるために、isEqualToString:メソッドで文字列を判定し、YES/NOに置換して設定しています。
スライダは、floatForKey:メソッドで実数値を取得し、valueプロパティで設定しています。
・viewFlipsideBackgroundColor
+ (UIColor *)viewFlipsideBackgroundColor
反転している間のビューの裏面で使用されるシステムカラーを返します。
戻り値はUIColorオブジェクトです。
・floatForKey:
- (float)floatForKey:(NSString *)defaultName
指定したキーに関連付けされている浮動小数点値を返します。
戻り値は指定したキーに関連付けされている浮動小数点値で、指定したキーが存在しない場合には0を返します。
defaultName:現在のユーザのデフォルトデータベース内のキーを指定します。
4)viewWillDisappear:の追加
viewWillDisappear:メソッドは、フリップサイドビューが非表示になる際に呼び出されるメソッドで、ここではフリップサイドビューで設定されたスイッチとスライダの値をSettingsアプリケーションのデフォルトオブジェクトに書き戻す処理を行っています。
最初にSettingsアプリケーションのデフォルトオブジェクトを、NSUserDefaultsクラスのstandardUserDefaultsメソッドで取得します。
スイッチは独自の文字列で設定されるので、onプロパティで得たON/OFFの状態を文字列に置換し、setObject:forKey:メソッドで設定します。
スライダはsetFloat:forKey:メソッドで設定します。
・setFloat:forKey:
- (void)setFloat:(float)value forKey:(NSString *)defaultName
指定した浮動小数点値を対応するキーを指定してデフォルトに設定します。
setObject:forKeyの機能の一部として呼び出します。
value:デフォルトのデータベースへ設定する浮動小数点値を指定します。
defaultName:浮動小数点値に対応するキーを設定します。
5)done:メソッドについて
done:メソッドは、Utility Applicationテンプレートで自動生成され、フリップサイドビューのナビゲーションバー左側にあるDoneボタンをタップした際に呼び出されるアクションメソッドです。
デリゲートに対し、flipsideViewControllerDidFinish:メソッドで自身(FlipsideViewController)を渡しています。
6)viewDidUnloadの実装
本書ではviewDidUnloadは記述されていませんが、サンプルコードのように2つのプロパティの所有権放棄を行います。
スーパークラスによる初期化は、最初に行っています。
7)shouldAutorotateToInterfaceOrientation:の実装
本書では太字で示されておらず、サンプルコードではコメントアウトされていますが、shouldAutorotateToInterfaceOrientation:のコメントアウトを解除してデフォルトの状態(ポートレートのみ有効)で実装しています。
8)deallocの実装
deallocでは本書やサンプルコードと同じく、2つのプロパティの解放を行っています。
●実行
『ビルドと実行』を行うと、アプリケーションのフリップサイドビューは下図のような表示になります。

ここで設定したスイッチやスライダの値はメインビューだけでなく、Settingsアプリケーションにも反映されます。


参考文献
・UIColor Class Reference
・NSUserDefaults Class Reference
![]() | はじめてのiPhone3プログラミング (2009/12/17) Dave Mark、Jeff LaMarche 他 商品詳細を見る |