クロックのメソッド

2010. 05. 24
基礎からのiPhone SDK 改訂版』の『クロックの作成』のメソッドを説明します。

●タイマーのメソッド

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    

    // Override point for customization after application launch

    timerClock = [NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(updateClock:) userInfo:nil repeats:YES];

    [window makeKeyAndVisible];

    return YES;
}

scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:メソッドは『Foundation(タイマー)』で紹介済みでした。

このメソッドは実行ループの中にNSTimerオブジェクトを作成するもので、タイマーの内容は下記のようになっています。

・1.0秒間隔で発火
・self(Clock App Delegate自身)にメッセージを送信
・発火時にupdateClock:メソッドを呼び出し
・メソッドに渡す引数は無し
・リピートはON

発火時のメソッド呼び出しを行う引数は、SEL型という特別な型が使用されています。

+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)seconds target:(id)target selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)repeats

SEL型はobjc.hで下記のように定義されています。

typedef struct objc_selector *SEL;

『Objective-C プログラミング言語/Objective-C のランタイム関数とデータ構造体/Objective-C データ型/クラス定義データ構造体/SEL』によると、SEL型はメソッドセレクタを表す構造体で、メセッドセレクタとはメソッドの名前をマップされたC文字列に登録されたものとなっています。

これだけではよく分かりませんが『Mac OS X Cocoaプログラミング(私が持っているのは古い版ですが、参考文献には新しい版を紹介しています)』によると、アプリケーションをコンパイルすると、メソッドは(コンパイラが自動生成する)セレクタテーブルにインデックス付けされるとあります。

つまり各メソッドに番号を割り振り、(コンパイル後にアプリケーション内部で)メソッドを呼び出す時はメソッド名ではなく、割り振ったインデックス番号で呼び出しているということです。

このインデックス番号とメソッドの対応表(objc_selector構造体)が、セレクタテーブルまたはメソッドセレクタと呼ばれるものです。

『@selector()』は『詳解 Objective-C 2.0』によるとコンパイラ指示子で、()内で指定したメソッドにコンパイラが自動で割り振るインデックス番号に置き換えると解釈できます。


●日時の取得と表示のメソッド

- (void)updateClock:(NSTimer *)theTimer {
    // 現在の日時の取得とフォーマッタの生成
    NSDate *date = [NSDate date];
    NSDateFormatter *form = [[NSDateFormatter alloc] init];

    // 日付の文字列をラベルにセット
    [form setDateStyle:NSDateFormatterFullStyle];
    [form setTimeStyle:NSDateFormatterNoStyle];
    labelDate.text = [form stringFromDate:date];

    // 時刻の文字列をラベルにセット
    [form setDateStyle:NSDateFormatterNoStyle];
    [form setTimeStyle:NSDateFormatterMediumStyle];
    labelTime.text = [form stringFromDate:date];

    [form release];
}

※2010.5.24訂正
NSDateFormatterオブジェクトのformを解放する記述が抜けていました。
お詫びして訂正させていただきます。

・現在の日時の取得

ちょっと紛らわしいですが、NSDate型のdateオブジェクトにdateメソッドで取得した現在の日時を入れています。

dateメソッドは『Foundation(日付と時間)』で紹介しています。

ここで取得している現在日時(NSDateオブジェクト)の中身は『クロックの使用しているクラス』の説明していますが、2001年1月1日0時0分0秒(GMT)からの経過秒数になっています。

NSDateのdateメソッドは生成と初期化を兼ねていますが、NSDateFormatterには生成メソッドが無いのでallocで生成し、initメソッドで初期化しています。


・init
(NSDateFormatterクラス)

- (id)init

NSDateFormatterインスタンスを初期化して返します

NSDateFormatterインスタンスを、ロケール、タイムゾーン、カレンダーと動作に適したデフォルト値の設定で初期化します。

10.4-スタイルのdate formatterでは多くの新しい属性が設定可能で、ロケールを含む、タイムゾーン、カレンダー、フォーマット文字列、2桁年表示の相互変換、不確定のコンポーネントに提供するデフォルトの日付と、また月名のような様々な文字列にアクセスできます。

しかし、個々の設定を変更することは推奨されません。

代わりに、適したスタイル定数とsetTimeStyle:、setDateStyle:を使ってフォーマットを指定子、確立されているデフォルト設定での初期化を勧めます。
(これらはシステム環境設定の『言語環境』で設定されます。NSDateFormatterStyleを参照)

特別な考慮事項

Mac OS X 10.4で動作させる場合、クラスのデフォルト動作ではNSDateFormatterBehavior10_4が設定されないので、新しいインスタンスに引数NSDateFormatterBehavior10_4を渡したsetFormatterBehavior:メッセージを送信する必要があります。


・setDateStyle:
(NSDateFormatterクラス)

- (void)setDateStyle:(NSDateFormatterStyle)style

レシーバの日付のスタイルを設定します

style:レシーバの日付スタイルを指定します
指定可能な値はNSDateFormatterStyleを参照してください


・setTimeStyle:
(NSDateFormatterクラス)

- (void)setTimeStyle:(NSDateFormatterStyle)style

レシーバの時刻のスタイルを設定します

style:レシーバの時刻スタイルを指定します
指定可能な値はNSDateFormatterStyleを参照してください


・NSDateFormatterStyle
(NSDateFormatterクラス)

日付と時刻のフォーマットスタイルを、予め定義されている以下の定数で指定します。
NSDateFormatter.hで定義されています。

enum {    // date and time format styles
    NSDateFormatterNoStyle = kCFDateFormatterNoStyle,
    NSDateFormatterShortStyle = kCFDateFormatterShortStyle,
    NSDateFormatterMediumStyle = kCFDateFormatterMediumStyle,
    NSDateFormatterLongStyle = kCFDateFormatterLongStyle,
    NSDateFormatterFullStyle = kCFDateFormatterFullStyle
};
typedef NSUInteger NSDateFormatterStyle;

・NSDateFormatterNoStyle
スタイルを指定しません

・NSDateFormatterShortStyle
短いスタイルで、通常は『11/23/37』や『3:30pm』のような数値のみの指定になります

・NSDateFormatterMediumStyle
中間のスタイルで、通常は『Nov 23, 1937』のような簡略化したテキストの指定になります

・NSDateFormatterLongStyle
長いスタイルで、通常は『November 23, 1937』や『3:30:32pm』のような省略しないテキストの指定になります

・NSDateFormatterFullStyle
完全な詳細を示すフルのスタイルで、『Tuesday, April 12, 1952 AD』や『3:20:42pm PST』のような指定になります

日付と時刻のスタイルのフォーマットはOSのバージョンとユーザの設定が優先され、ロケールに依存するために(ユーザ環境によって設計者の意図を)正確に表現できない場合があります。

(設計者の意図通りの)正確な形式が必要な場合は、これらの定数を使用しないでください。


・stringFromDate:
(NSDateFormatterクラス)

- (NSString *)stringFromDate:(NSDate *)date

レシーバの現在の設定を使用したフォーマットで、指定した日付を文字列で表して返します

date:文字列に表す日付を指定します



参考文献

NSTimer Class Reference

NSDateFormatter Class Reference

基礎からのiOS SDK基礎からのiOS SDK
(2010/10/09)
鶴薗 賢吾、松浦 健一郎 他

商品詳細を見る

Mac OS X Cocoaプログラミング 第三版Mac OS X Cocoaプログラミング 第三版
(2009/11/01)
Aaron Hillegass、アーロン ヒレガス 他

商品詳細を見る

詳解 Objective-C 2.0 第3版詳解 Objective-C 2.0 第3版
(2011/12/28)
荻原 剛志

商品詳細を見る






Bose QuietComfort 20
0 Comments
Leave a comment
管理者にだけ表示を許可する
Top
0 Trackbacks
Top
Calendar
08 | 2017/09 | 10
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 QuietComfort 20
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