NSDate initWithTimeInterval:sinceDate:でX年後の日付を求める際の注意点

現象

  • NSDate の initWithTimeInterval:sinceDate: メソッドを使って簡易的に100年後の日付を求めようとしたら値がおかしい。

ソースコード(誤)

#define kOneDay (24*60*60) 

#define kOneYear (365*kOneDay)

- (NSDate*)test

{

    NSDate* date = [NSDate date];

    NSDate* laterDate = [[NSDate alloc]

                     initWithTimeInterval:100*kOneYear

                     sinceDate:date];

    // for debug

    NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];

    NSDateComponents* dc = [calendar components:NSYearCalendarUnit fromDate:laterDate];

    NSLog(@">>> year = %d", [dc year]);

    return laterDate;

 }

結果

>>> year = 1977

どうやら、桁あふれが起きている。

TimeInterval で表現できるのは60年くらいまでのようだ。

どおりで initWithTimeInterval: のサンプルコードで○年後というのは見ないわけだ…。

上記ではうるう年等の正確な計算もできないので、NSDateComponents を使うよう修正。

ソースコード(正)

- (NSDate*)test2

{

    NSDate* date = [NSDate date];

    NSCalendar *calendar = [[NSCalendaralloc] initWithCalendarIdentifier:NSGregorianCalendar];

    NSDateComponents* offset = [calendar components:NSYearCalendarUnitfromDate: date];

    [offset setYear:100];

    NSDate* laterDate = [calendar dateByAddingComponents:offset toDate:self.birthday options:0];

    

    // for debug

    NSCalendar *debugCalendar = [[NSCalendaralloc] initWithCalendarIdentifier:NSGregorianCalendar];

    NSDateComponents* dc = [debugCalendar components:NSYearCalendarUnitfromDate:laterDate];

    NSLog(@">>> year = %d", [dc year]);

    return laterDate;

 

}

結果

>>> year = 2113

ちゃんと出た。

結論

  • 「○時間後」「○日後」は initWithTimeInterval でいいが、「○年後」はうるう年の考慮もできる NSDateComponents の dateByAddingComponents:toDate:options: を使う。
  • TimeInterval で表せるのは60年後程度まで

動作環境

  • XCode5 Developer preview

  • iPhoneシミュレータ(iOS7)

  • MacOS 10.8.4 

XCode5でのテキストの置換方法

探してしまいました。

XCode5で「検索(Find)」から「置換(Replace)」にする変更する場所が見つからない。

…と思ったら

f:id:wao9:20130629184617p:plain

検索ボックス上の「Find」の文字が押せて

f:id:wao9:20130629184632p:plain

Replaceに変更できました。

f:id:wao9:20130629184649p:plain

 「In Project」や「Ignoring Case」とちがいオンマウスで反応しないので少し見つけにくいですね。

 

動作環境

  • XCode5 Developer preview

  • MacOS 10.8.4 

XcodeでRunをしてもシミュレータでアプリが起動しない・起動に異様に時間がかかる場合の対処法

よく忘れるのでメモ

XcodeでRunをしてもシミュレータでアプリが起動しない・起動に異様に時間がかかる場合の対処法

a.シミュレータは起動するが、黒い画面のままアプリが起動しない場合

  1. シミュレータで cmd + shift + h を押してホーム画面へ
  2. 起動しないアプリを削除し、もう一度Runする

異様に時間がかかる場合も、これでだいたい直る

 

b.気がつくとRunがプスンと止まっており、シミュレータが起動しない場合

  1. シミュレータを起動した状態でMacのメニューバーからiOSシミュレータ>コンテンツと設定をリセット>リセット

これでだいたい直る

動作環境

  • XCode5 Developer preview

  • iPhoneシミュレータ(iOS7)

  • MacOS 10.8.4 

Storyboardで追加したUIのプロパティ名を変更するとエラー

現象

  1. Storyboardで配置したUIを、ViewControllerにプロパティとして追加
  2. スペルミスなどでViewControllerに追加したプロパティの名前を変更
  3. 該当のViewControllerを開こうとするとエラーで落ちる

エラーメッセージ

 

2013-06-22 17:25:25.108 Tasks[15010:c07] *** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<AddTaskViewController 0xa0b1c20> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key limitAgeField.'

解決法

  • ViewControllerで定義されている名前は変更したがStoryboardで設定している名前が変更されてないエラーなのはわかるが、具体的な解決法がわからない。
  • エラーメッセージでぐぐるとxibファイルの変数名も変更しろと出るが、Storyboardオンリーで作っているのでxibファイルは見当たらない。
  • 仕方ないので以下の方法で解決
  1. Main.storyboardを選択しXCode右上のボタンのうちComparisonモードで開く
    ※Main.storyboardをテキストエディターで開いてもOK)
    f:id:wao9:20130622174049p:plain ←いちばん右のボタンを押せばOK
  2. storyboardのソースコードが表示されるので、エラーが出ているプロパティで名で検索
    (テキスト画面が左右に2つ出ますが、左を修正します)

    f:id:wao9:20130622174131p:plain

  3. 検索されたプロパティ名を直に変更

    f:id:wao9:20130622174233p:plain

 

これでエラーが出なくなりました。

 

動作環境

  • XCode5 Developer preview

  • iPhoneシミュレータ(iOS7)

  • MacOS 10.8.4 

iPhoneシミュレータでキーボードから日本語を打ち込む

よく忘れるのでメモ。

 

XCodeiPhone/iPadシミュレータで、シミュレータのキーパッドではなくMacキーボードから日本語を入力する方法。

  1. アプリを起動している場合は command + shift + h でホーム画面を表示
  2. "Settings"(日本語環境の場合は"設定")アプリを選択
  3. General>Keyboard>Keyboards>Add New Keyboard>Japanese (Romaji) を選択。
  • Japanese (Romaji) ←ローマ字入力。キーボードからローマ字を打つと日本語に変換できる

f:id:wao9:20130618213741p:plain

  • Japanese (Kana) ←かな入力。キーボードから英字は入力できるが日本語に変換はできない。

f:id:wao9:20130618213808p:plain

キーボードから日本語を入力したい場合はJapanese (Romaji)で。英字はどちらでも入力できます。

*[XCode5][iOS7][StoryBoard]TextFieldに設定できるキーボード一覧

TextFieldに設定できるキーボード一覧

  • Default:デフォルト
  • ASCII Capable:英字
  • Numbers and Punctuation:数字+記号
  • URL:URL用。.comなど
  • Number Pad:テンキー
  • Phone Pad:テンキー+  *#  など電話に使うもの
  • Name Phone Pad:
  • E-mail Address:Email用。.や@など。
  • Decimal Pad:小数点用。小数点がある。
  • Twitter:ツイッター用。@や#がある。
  • Web Search:Webサーチ用。.comなど

 

  • Default:デフォルト

f:id:wao9:20130617223753p:plain

 

  • ASCII Capable:英字

f:id:wao9:20130617223820p:plain

 

  • Numbers and Punctuation:数字+記号

f:id:wao9:20130617224409p:plain

 

 

  • URL:URL用。.comなど

f:id:wao9:20130617223921p:plain

 

  • Number Pad:テンキー

f:id:wao9:20130617224042p:plain

 

  • Phone Pad:テンキー+  *#  など電話に使うもの

f:id:wao9:20130617224054p:plain

 

  • Name Phone Pad:

f:id:wao9:20130617224512p:plain

 

  • E-mail Address:Email用。.や@など。

f:id:wao9:20130617224313p:plain

 

  • Decimal Pad:小数点用。小数点がある。

f:id:wao9:20130617224257p:plain

 

  • Twitter:ツイッター用。@や#がある。

f:id:wao9:20130617224226p:plain

 

  • Web Search:Webサーチ用。.comなど

f:id:wao9:20130617224200p:plain

動作環境

  • XCode5 Developer preview

  • iPhoneシミュレータ(iOS7)

  • MacOS 10.8.4