Persistence(3)~プロパティリストへの保存(1)

2011. 02. 06
最初のアプリケーションデータの保存は、プロパティリストを使用する方法です。


●アプリケーション終了の判定について

今回のプロジェクトでは、アプリケーション終了時に入力されたデータを自動保存するものなのですが、一つ問題があります。

旧版の本書、ならびにこれまで紹介していた(『はじめてのiPhone3プログラミング』の原著)『Beginning iPhone 3 Development: Exploring the iPhone SDK』はiPhone OS 3.x用のコードとなっており、現在のマルチタスクに対応したiOS 4.xに対応していません。

具体的に説明しますと、データを自動保存する際のトリガーとして、iPhone OS 3.x以前用のコードは通知UIApplicationWillTerminateNotificationを受信してapplicationWillTerminate:メソッドで処理を行っています。

iPhone OS 3.x以前では、ホームボタンを押すことによりUIApplicationWillTerminateNotificationを発行してアプリケーションが終了するのですが、iOS 4.x以降はマルチタスクに対応しているため、ホームボタンを押してもバックグラウンドにアプリケーションが存在しているためにUIApplicationWillTerminateNotificationが発行されません。

さらにホームボタンをダブルクリックしてアプリケーションのタスクを終了した場合は強制終了扱いとなり、この場合もUIApplicationWillTerminateNotificationが発行されないため、データが保存されません。

調べてみた所、iOS 4.xに対応した最新版『Beginning iPhone 4 Development: Exploring the iOS SDK』が発行されており、サンプルコードがマルチタスクに対応していることが分かりました。

iOS 4.x用では、アプリケーション終了を知らせるUIApplicationWillTerminateNotificationの代わりに、アプリケーションが非アクティブになったことを知らせる通知UIApplicationWillResignActiveNotificationを受信し、applicationWillResignActive:メソッドで処理を行うように変更されています。

今後はサンプルコードとしてiOS 4.x対応の最新版『Beginning iPhone 4 Development: Exploring the iOS SDK』を参考にしていきますので、ご留意ください。


●データを自動保存するメソッドについて

アプリケーションの非アクティブ通知(旧版では終了通知)を受信した時にデータを自動保存するメソッドにはapplicationWillResignActive:(旧版ではapplicationWillTerminate:)が使用されています。

この2つはUIApplicationDelegateプロトコルにも同名のメソッドがありますが、UIApplicationDelegateプロトコルのメソッドは引数がUIApplicationクラスです。

しかし新旧版とも、サンプルコードでは引数がNSNotificationクラスになっており、オーバーライドしていることになります。

ちなみに引数がNSNotificationクラスのapplicationWillResignActive:(旧版ではapplicationWillTerminate:)は、Mac OS X用のNSApplicationDelegateプロトコルのメソッドとして存在します。

木下誠さんも『iPhone SDKプログラミング大全』の中で引数をNSNotificationとしてapplicationWillTerminate:を使用していることから、Mac OS Xアプリケーション開発経験者が敢えてこのような記述をしているのかもしれません。
(『Foundation(通知)』参照)

ただiOS上で実際に受け取る通知はUIApplicationクラスのものですので、オーバーライドする必要性がよく分かりません。

現実には引数がNSNotificationでもUIApplicationでも動くのですが、ここではUIApplicationDelegateプロトコルのメソッドをオーバーライドせず、そのまま使用することにします。


●Persistenceアプリケーションの概要

今回のアプリケーションは、入力されたデータをプロパティリストとして保持する機能を確認するだけのもので、細かな所作は詰めていません。

Persistenceアプリケーションにはテキストフィールドが4つあります。

1195

テキストフィールドをタップするとキーボードが現れ、文字を入力できます。

returnキーによる次行への移動や、入力校正、キーボードの片付けなどの処理は行っていません。

1196

ホームボタンを押して、Persistenceアプリケーションを非アクティブにすると、Documentsフォルダ下にプロパティリストが作成されます。

1198

このプロパティリストの中身は、4つのテキストフィールドに入力された文字列の配列になります。

1199

プロパティリストにデータが保持されているので、ホームボタンをダブルクリックしてアプリケーションを強制終了しても、次回起動時には保持されたデータが表示されます。

1197

入力済みのテキストを変更しても、非アクティブになる際にプロパティリストが更新されます。

デバイスをリセットするとデータは(アプリケーションのディレクトリごと)削除されます。


●プロジェクトの作成

View-based Applicationテンプレートで、プロジェクト名を『Persistence』とします。

1200


●ビューコントローラのヘッダファイルPersistenceViewController.hの編集

ユーザデータを保存するプロパティリストのファイル名となる定数と、4つのテキストフィールドのアウトレットとなるプロパティ、プロパティリストへのファイルパスを生成するメソッドを宣言します。
(太字が追加した部分)

#import <UIKit/UIKit.h>

#define kFilename @"data.plist"

@interface PersistenceViewController : UIViewController {
    UITextField *field1;
    UITextField *field2;
    UITextField *field3;
    UITextField *field4;

}

@property (nonatomic, retain) IBOutlet UITextField *field1;
@property (nonatomic, retain) IBOutlet UITextField *field2;
@property (nonatomic, retain) IBOutlet UITextField *field3;
@property (nonatomic, retain) IBOutlet UITextField *field4;

- (NSString *)dataFilePath;


@end

1201

データを保存するプロパティリストのファイル名をdata.plistとします。

4つのテキストフィールドのプロパティは、サンプルコードと同様にテンプレートの自動生成の書式に倣ってIBOutletの記述をインスタンス変数の宣言ではなく、プロパティの宣言時に行っています。

プロパティリストへのファイルパスを生成するメソッドはdataFilePathです。

本書やサンプルコードではNSNotificationのインスタンスを引数とするapplicationWillResignActive:(旧版ではapplicationWillTerminate:)をオーバーライドしていますが、ここでは省略してUIApplicationのインスタンスを引数とするオリジナルのメソッドを使用します。


●ビューコントローラのnibファイルPersistenceViewController.xibの編集

Resources下にあるビューコントローラのnibファイルPersistenceViewController.xibファイルをダブルクリックし、Interface Builderで開きます。

LibraryウィンドウからViewウィンドウへ、LabelとText Fieldを4つずつドラッグ&ドロップして追加します。

各パーツの位置とサイズは下表の通りです。

LabelX:Y:W:H:Text FieldX:Y:W:H:
Line 1:20255321 812021931
Line 2:20625321 815921931
Line 3:201015321 819821931
Line 4:201405321 8113721931

ラベルのタイトルは、InspectorウィンドウのAttributesタブを開き、LabelのTextで変更します。

1202

DocumentウィンドウでFile's Ownerを選択し、INspectorウィンドウのConnectionsタブを開いて、アウトレットをViewウィンドウのテキストフィールドに接続します。

1203



参考文献

UIApplication Class Reference

UIApplicationDelegate Protocol Reference

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

商品詳細を見る

Beginning Ios 6 Development: Exploring the Ios SdkBeginning Ios 6 Development: Exploring the Ios Sdk
(2012/12/26)
David Mark、Jack Nutting 他

商品詳細を見る






SoundSport Pulse wireless headphones
0 Comments
Leave a comment
管理者にだけ表示を許可する
Top
0 Trackbacks
Top
Calendar
04 | 2017/05 | 06
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

SoundSport Pulse wireless headphones
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