アクション名を設定する
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フォルダの中に新規ファイルを作成します。

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

名前をLocalizable.stringsとします。

このファイルを以下の様に編集します。
"setAmplitude" = "Change Amplitude";
"setFrequency" = "Change Frequency";
"setPhaseLag" = "Change PhaseLag";
これでアンドゥメニューが"Undo Change Amplitude"と表示される様になります。
ファイル名がLocalizable.stringsである事でもわかるように、これはそもそもアプリケーションをローカライズ(各国語対応)させる為のものです。ただしまだアプリケーションが未完成なので、当面ローカライズは見送ります。

ホーム
前へ