AppSettings(9)~FlipsideViewController

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

1104

フリップサイドビューはメインビューのインフォメーションボタンをタップすると表示され、スイッチとスライダの設定を行うことができます。

ここでの設定はメインビューだけでなく、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

1169

最初の@protocolはFlipsideViewControllerDelegateプロトコルの前方宣言で、FlipsideViewControllerDelegateという文字列がプロトコルであることをコンパイラに指示しているものです。

この前方宣言は、インスタンス変数delegateがFlipsideViewControllerDelegateプロトコルに適合するという型宣言のために行っています。

最後の方にある@protocolはFlipsideViewControllerDelegateプロトコルの宣言で、(MainViewControllerで実装している)flipsideViewControllerDidFinish:メソッドを宣言しています。

アクションメソッドdone:も含めて、太字以外はUtility Applicationテンプレートで自動生成されます。

太字で示しているスイッチとスライダのアウトレットが追加した部分です。


●フリップサイドビューのnibファイルFlipsideView.xibの編集

Resources下のFlipsideView.xibをダブルクリックし、Interface Builderで開きます。

デフォルトのフリップサイドビューは、背景色がダークグレーになっています。

1170

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

1171

1172

次にラベル2つとスイッチとスライダを設置します。

 X:Y:W:H:
Label (StrikerUnit)2010611321
Label (Breasts)2016011321
Switch2061039427
Horizontal Slider1818928423

スイッチ用のラベルのテキストは『StrikerUnit』、スライダ用のテキストは『Breasts』とします。

スライダについてはInspectorウィンドウのAttributesタブで、最小値/最大値/初期値をそれぞれ60.00/100.00/80.00に、最小値/最大値の画像をそれぞれturtle.pngとrabbit.pngに設定します。

1173

1174

最後にアウトレットを接続します。

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

1175


●フリップサイドビューコントローラのソースファイル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

1177

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つのプロパティの解放を行っています。


●実行

『ビルドと実行』を行うと、アプリケーションのフリップサイドビューは下図のような表示になります。

1176

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

1178

1179



参考文献

UIColor Class Reference

NSUserDefaults Class Reference

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

商品詳細を見る






Bose Solo 5 TV sound system
0 Comments
Leave a comment
管理者にだけ表示を許可する
Top
0 Trackbacks
Top
Calendar
07 | 2017/08 | 09
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

ボーズ・オンラインストア
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