AppSettings(8)~MainViewController(3)

2011. 01. 30
●メインビューコントローラのソースファイルMainViewController.mの編集

ソースファイルでは、アウトレットのプロパティとラベルの設定メソッドrefreshFieldsの実装を行います。
(太字が追加・修正した部分)

#import "MainViewController.h"

@implementation MainViewController

@synthesize nameLabel;
@synthesize ageLabel;
@synthesize countryLabel;
@synthesize strikerUnitLabel;
@synthesize breastsLabel;
@synthesize favoriteTeaLabel;
@synthesize favoriteCandyLabel;
@synthesize favoriteGameLabel;
@synthesize favoriteExcuseLabel;
@synthesize favoriteSinLabel;

- (void)refreshFields {
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    nameLabel.text = [defaults objectForKey:kNameKey];
    ageLabel.text = [defaults objectForKey:kAgeKey];
    countryLabel.text = [defaults objectForKey:kCountryKey];
    strikerUnitLabel.text = [defaults objectForKey:kStrikerUnitKey];
    breastsLabel.text = [[defaults objectForKey:kBreastsKey] stringValue];
    favoriteTeaLabel.text = [defaults objectForKey:kFavoriteTeaKey];
    favoriteCandyLabel.text = [defaults objectForKey:kFavoriteCandyKey];
    favoriteGameLabel.text = [defaults objectForKey:kFavoriteGameKey];
    favoriteExcuseLabel.text = [defaults objectForKey:kFavoriteExcuseKey];
    favoriteSinLabel.text = [defaults objectForKey:kFavoriteSinKey];
}

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
 
        // Custom initialization.
    }
    return self;
}

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    [self refreshFields];
}
 

// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad {
    [super viewDidLoad];
    [self refreshFields];
}


- (void)flipsideViewControllerDidFinish:(FlipsideViewController *)controller {
    [self dismissModalViewControllerAnimated:YES];
    [self refreshFields];
}

- (IBAction)showInfo:(id)sender {
    FlipsideViewController *controller = [[FlipsideViewController alloc] initWithNibName:@"FlipsideView" bundle:nil];
    controller.delegate = self;

    controller.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
    [self presentModalViewController:controller animated:YES];

    [controller release];
}

- (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.nameLabel = nil;
    self.ageLabel = nil;
    self.countryLabel = nil;
    self.strikerUnitLabel = nil;
    self.breastsLabel = nil;
    self.favoriteTeaLabel = nil;
    self.favoriteCandyLabel = nil;
    self.favoriteGameLabel = nil;
    self.favoriteExcuseLabel = nil;
    self.favoriteSinLabel = 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 {
    [nameLabel release];
    [ageLabel release];
    [countryLabel release];
    [strikerUnitLabel release];
    [breastsLabel release];
    [favoriteTeaLabel release];
    [favoriteCandyLabel release];
    [favoriteGameLabel release];
    [favoriteExcuseLabel release];
    [favoriteSinLabel release];

    [super dealloc];
}

@end

1166

1)MainView.hのインポートについて

本書やサンプルコードではMain ViewとFlipside ViewそれぞれにViewクラスとViewControllerクラスがあるのですが、現在のUtility Applicationテンプレートでは自動生成されませんし、旧版の本書では触れておらず、新版のサンプルコードを見てもこれといった処理はしていないですし、無くても動きますので省略します。

2)ラベルのプロパティの実装

アウトレットである10個のラベルのプロパティを実装します。

3)refreshFieldsメソッドの実装

refreshFieldメソッドは、Settingsアプリケーションのデフォルトデータベースオブジェクトから設定値を取得し、10個あるメインビューのラベルの文字列として設定するメソッドです。

このメソッドは、viewDidAppear:viewDidLoad、flipsideViewControllerDidFinish:メソッドから呼び出されます。

まず最初にSettingsアプリケーションのデフォルトオブジェクトを、NSUserDefaultsクラスのstandardUserDefaultsメソッドで取得します。

取得したインスタンスdefaultsから、ヘッダファイルして設定したキー定数を使いobjectForKey:メソッドでオブジェクトを取得することができます。

戻り値のほとんどは(TypeがStringであるため)NSStringオブジェクトなので、ラベルのテキストにそのまま設定できます。

ただしスライダ要素のkBreastsKeyの戻り値は実数であるNSNumberオブジェクトになるため、stringValueメソッドで型を変換してラベルのテキストに設定しています。


standardUserDefaults

+ (NSUserDefaults *)standardUserDefaults

共有のデフォルトオブジェクトを返します。

共有のデフォルトオブジェクトがまだ存在しない場合は、以下のドメインの順序で名前を含むリストを検索して生成します。

NSArgumentDomainで、アプリケーションの引数から解析したデフォルトを構成
・アプリケーションのバンドル識別子でドメインを識別
NSGlobalDomainで、全てのアプリケーションで見られる意味からデフォルトを構成
・各ユーザの優先言語のための別ドメイン
NSRegistrationDomainで、一時的なデフォルトを設定し、アプリケーションによる検索が常に成功するように値を設定

デフォルトは現在のユーザ用に初期化されます。

標準検索リストの後続の変更は、このメソッドが再度呼び出されても残ります。

検索リストはこのメソッドが呼び出された初回のみ、標準で保証されます。

共有インスタンスは、allocとinitWithUser:またはinitを使ってカスタムインスタンスを容易に生成することができます。


objectForKey

- (id)objectForKey:(NSString *)defaultName

デフォルトの中で最初に発見した、指定したキーに対応するオブジェクトを返します。

指定したキーに対応するオブジェクトが無い場合はnilを返します。

このメソッドは検索リストの順でドメインを検索します。

元が可変オブジェクトの場合であっても、戻り値は固定オブジェクトになります。

defaultName:現在のユーザのデフォルトデータベースの中にあるキーを指定します。


stringValue

- (NSString *)stringValue

人が読める文字列として、レシーバの値を返します。

生成にはdescriptionWithLocale:のロケールをnilとして呼び出します。

4)initWithNibName:bundle:の実装

initWithNibName:bundle:メソッドは本書では太字で示されていないのですが、サンプルコードにもありますので実装します。

現在のUtility Applicationテンプレートでは自動生成されないので、UIViewController subclassのテンプレートからコピーして使用しています。
(旧版の本書の記述とテンプレートのものでは僅かに記述が異なりますが、内容は同じです)

5)viewDidAppear:の実装

viewDidAppear:はビューが表示された後で呼び出されるメソッドで、refreshFieldsの呼び出しを追加します。

後述のviewDidLoadと異なり、ビューが表示される度に呼び出されます。

initWithNibName:bundle:メソッドと同様に自動生成されないので、UIViewController subclassのテンプレートからコピーして使用しています。

本書やサンプルコードでは、スーパークラスによる初期化を最後にしていますが、ここでは最初に行っています。

6)viewDidLoadの実装

viewDidLoadはコメントアウトを解除します。

本書やサンプルコードではスーパークラスによる初期化が記述されていませんが、ここでは残しておき、その後にrefreshFieldsの呼び出しを追加します。

7)flipsideViewControllerDidFinish:について

flipsideViewControllerDidFinish:メソッドは、FlipsideViewController.hで宣言されているFlipsideViewControllerDelegateプロトコルのメソッドで、Utility Applicationテンプレートで自動生成されます。
(MainViewController.hでのFlipsideViewController.hのインポートと、FlipsideViewControllerDelegateプロトコルを採用しているのは、このメソッドのためです)

flipsideViewControllerDidFinish:メソッドでは、(モーダルビューである)フリップサイドビューを閉じてメインビューに戻るdismissModalViewControllerAnimated:メソッドを呼び出しており、このメソッドは親ビューコントローラが呼び出す必要があるため、MainViewController.mで実装しています。

また、refreshFieldsの呼び出しを追加します。


dismissModalViewControllerAnimated:

- (void)dismissModalViewControllerAnimated:(BOOL)animated

レシーバによって表示されたモーダルビューコントローラを閉じます。

親ビューコントローラは、presentModalViewController:animated:メソッドを使用して表示したモーダルビューコントローラを閉じる責任があります。

モーダルビューコントローラ自体がこのメソッドを呼び出しても、モーダルビューコントローラが自動的にこのメッセージを親ビューコントローラに転送します。

いくつかのモーダルビューコントローラを連続して表示する際に、モーダルビューコントローラのスタックを構築する場合、スタックの下位にあるビューコントローラがこのメソッドを呼び出すと、スタックにあるその子ビューコントローラ以上の全てのビューコントローラは閉じられます。

この場合、最上位のビューのみが閉じる際にアニメーションし、中間にある全てのビューコントローラは単純にスタックから削除されます。

モーダルトランジションスタイルを使用して最上位ビューを閉じる場合、スタックの下位にある他のビューコントローラで使用されているスタイルと異なる場合があります。

レシーバのモーダルビューコントローラへの参照を保持したい場合、このメソッドを呼び出す前にmodalViewControllerプロパティで値を取得してください。

animated:YESの場合、このメソッドはビューを閉じる際にアニメーションし、それ以外の場合はアニメーションしません。
アニメーションのスタイルは、閉じるビューコントローラのmodalTransitionStyleプロパティの値によって決定されます。

8)showInfo:の実装

showInfo:メソッドは、メインビューのインフォメーションボタンをタップした際に呼び出されるアクションメソッドで、Utility Applicationテンプレートで自動生成されます。

最初に(モーダルビューである)フリップサイドビューをinitWithNibName:bundle:メソッドで読み込んでインスタンスを生成し、デリゲートを設定します。

次にメインビューからフリップサイドビューへ移行する際のスタイルを、modalTransitionStyleプロパティで水平方向の回転(UIModalTransitionStyleFlipHorizontal)に設定します。

そしてpresentModalViewController:animated:メソッドで、フリップサイドビューを表示します。


modalTransitionStyle

@property(nonatomic, assign) UIModalTransitionStyle modalTransitionStyle

現在のビューコントローラをモーダルに表示する時のトランジション(遷移)スタイルです。

このプロパティは、現在のビューコントローラがpresentModalViewController:animated:メソッドを使用して表示された時の方法に作用します。

トランジションのタイプを変更する場合、ビューコントローラを表示する前にこのプロパティを設定する必要があります。

このプロパティのデフォルト値はUIModalTransitionStyleCoverVerticalです。

トランジションスタイルの有効なリストと、使用可能なプレゼンテーションスタイルとの互換性については、『UIModalTransitionStyle』を参照してください。


UIModalTransitionStyle

モーダルなビューコントローラを表示する際に利用できるトランジションスタイルです。

typedef enum {
    UIModalTransitionStyleCoverVertical = 0,
    UIModalTransitionStyleFlipHorizontal,
    UIModalTransitionStyleCrossDissolve,
    UIModalTransitionStylePartialCurl,
} UIModalTransitionStyle;

UIModalTransitionStyleCoverVertical
ビューコントローラを表示する時、画面の下部から上にビューがスライドします。
閉じる時はビューが下にスライドして戻ります。
これはデフォルトのトランジションスタイルです。

UIModalTransitionStyleFlipHorizontal
ビューコントローラを表示する時、現在のビューが右から左に3Dで水平方向に回転を始め、その結果以前のビューの背面が新しいビューのように見えます。
閉じる時は左から右に回転し元のビューに戻ります。

UIModalTransitionStyleCrossDissolve
ビューコントローラを表示する時、現在のビューがフェードアウトすると同時に新しいビューがフェードインします。
閉じる時は同様なクロスフェードで元のビューに戻ります。

UIModalTransitionStylePartialCurl
ビューコントローラを表示する時、現在のビューのある角がカールアップし、その下にモーダルビューが表示されます。
閉じる時はモーダルビューの上にカールアップしたページが広がって戻ります。
このトランジションを使用して表示したモーダルビューは、それ自身にモーダルビューを追加表示することはできません。
このトランジションスタイルは、親ビューコントローラがフルスクリーンビューで表示されていて、UIModalPresentationFullScreenモーダルプレゼンティングスタイルを使用している場合のみサポートします。
異なる種類の要素を持つ親ビューや、異なるプレゼンテーションスタイルを使おうとすると例外が発生します。


presentModalViewController:animated:

- (void)presentModalViewController:(UIViewController *)modalViewController animated:(BOOL)animated

ユーザに指定されたビューコントローラによって管理されているモーダルビューを表示します。

iPhoneとiPod touchデバイスは、modalViewControllerのビューは常にフルスクリーンで表示されます。

iPadでは、modalPresentationStyleプロパティの値に依存して表示されます。

指定されたビューコントローラにmodalViewControllerプロパティを設定します。

そのビューをリサイズしビュー階層へ組み込みます。

ビューのアニメーションは、引数modalViewController内のmodalTransitionStyleプロパティで指定されたトランジションスタイルに従います。

modalViewController:モーダルビューを管理するビューコントローラを指定します。

animated:YESの場合、このメソッドはビューを表示する際にアニメーションし、それ以外の場合はアニメーションしません。

9)viewDidUnloadの実装

本書ではviewDidUnloadは記述されていませんが、サンプルコードのように10個のプロパティの所有権放棄を行います。

10)deallocの実装

deallocでは本書やサンプルコードと同じく、10個のプロパティの解放を行っています。


●実行

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

1167

項目Ageは、Settingsアプリケーションでの設定時には黒丸で表示が伏せられていますが、値は普通に取得して表示することができます。

1168

フリップサイドビューはこれから作るのでビューは空ですが、インフォメーションボタンでのビューの遷移、フリップサイドビューのDoneボタンの応答、ならびにデータ更新は機能しています。



参考文献

NSUserDefaults Class Reference

NSNumber Class Reference

UIViewController Class Reference

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

商品詳細を見る






bose_soundlink_revolve
0 Comments
Leave a comment
管理者にだけ表示を許可する
Top
0 Trackbacks
Top
Calendar
03 | 2017/04 | 05
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 - - - - - -
Recent Articles
iTunes


Swift
Categories
Tips
Profile

水月杏香

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

Wish List
WACOM


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

bose_soundlink_revolve
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