アンドゥメニューに対応する【実践的Macintoshプログラミング解説】

印刷用表示 |テキストサイズ 小 |中 |大 |

CoreData版 Repeating Motif Generator の開発 Repeating Motif Wonderland CoreData 実践的 Macintosh プログラミング解説

LinkIconホーム

更新日 2009-05-24

モデルとビューを連動させる

アンドゥメニューに対応する

undoMenu.png アンドゥメニューに現れるメニュー項目が適切なものになる様にします。

アクション名を設定する

 CoreDataを使っているおかげで、アンドゥを実装するコードを一切書いていないのに、アンドゥの機能が既に実現されています。例えば発振器の振幅を変更してコマンド+Zキーを押せば、振幅の値が元に戻ります。

 少し気になるのはメニューからアンドゥを実行した時です。メニューに"Undo setAmplitude"と表示されてしまいますが、これは少し不自然です。どうしてこうなるのでしょうか?

 振幅の値をセットするアクセサメソッドsetAmplitudeはこうなっています。

// 
//  OscillatorCD.m
//

- (void)setAmplitude:(NSNumber *)value
{
    [self setValue:value forKey:@"amplitude" action:@"setAmplitude"];
}

 setValue:forKey:action:メソッドはRMGRootクラスで実装されており以下の様になっています。

// 
//  RMGRoot.m
//

#define     UNDO_MANAGER    [[self managedObjectContext] undoManager]

- (void)setActionName:(NSString *)actionName
{
    if(![UNDO_MANAGER isUndoing] && ![UNDO_MANAGER isRedoing])
        [UNDO_MANAGER setActionName:NSLocalizedString(actionName,nil)];
}

- (void)setValue:(id)value
          forKey:(NSString *)key
          action:(NSString *)actionName
{
    [self willChangeValueForKey:key];
    [self setPrimitiveValue:value forKey:key];
    [self didChangeValueForKey:key];
    if(actionName != nil)
        [self setActionName:actionName];
}

 結局NSLocalizedString(@"setAmplitude",nil)が実行されていたのですが、メインバンドル内にLocalizable.stringsファイルが用意されていなかったので、渡したアクション名がそのまま返ってきていたというわけでした。

 そこでLocalizable.stringsファイルを作成します。Reourcesフォルダの中に新規ファイルを作成します。

newFileByContextMenu.png

 空のファイルを選択します。

newFileAssistant8.png

 名前をLocalizable.stringsとします。

newFileAssistant9.png

 このファイルを以下の様に編集します。

"setAmplitude" = "Change Amplitude";
"setFrequency" = "Change Frequency";
"setPhaseLag" = "Change PhaseLag";

 これでアンドゥメニューが"Undo Change Amplitude"と表示される様になります。

 ファイル名がLocalizable.stringsである事でもわかるように、これはそもそもアプリケーションをローカライズ(各国語対応)させる為のものです。ただしまだアプリケーションが未完成なので、当面ローカライズは見送ります。