0

わかりましたので、アプリで特定のアクションを元に戻す機能を追加したいと思います。私は自分のプロトカルか何かでそれを行う方法を作成するつもりでしたが、その後、NSUndoManager. ビルトインのファンデーションを使いたいのですが、よくわかりません。複数のサイコロの転がりを元に戻す必要があるため、以前のサイコロを のオブジェクトとして保存できれば、NSArrayおそらく最適です。を使用できますNSMutableStringが、配列が優先されます。

それから、シェイクして元に戻せることは知っていますが、ボタンがあればいいのにと思います。これらは私に最も問題を引き起こしています。以下に私の試みを含めました。それらのどれも機能していません。どんな助けでも大歓迎です。

ビューでDidLoad:

undoManager = [[NSUndoManager alloc] init];

次に、サイコロを振る方法で、次のことを試しました。

   [[undoManager prepareWithInvocationTarget:self] undoButton];
    [[undoManager prepareWithInvocationTarget:self] 
    [[undoManager prepareWithInvocationTarget:self] setString:[NSString stringWithFormat:@"%i", dice1num]];

setStrings:[NSArray arrayWithObjects:[NSString stringWithFormat:@"%i", dice1num]
    [NSString stringWithFormat:@"%i", dice1num],
    [NSString stringWithFormat:@"%i", dice1num],
    [NSString stringWithFormat:@"%i", dice1num],
    [NSString stringWithFormat:@"%i", dice1num], nil]];
[[undoManager prepareWithInvocationTarget:@selector()];
[undoManager setActionName:@"A roll"];

次に、元に戻すボタンにリンクする IBAction を次に示します。

-(IBAction)undoButton{
           [undoManager undo];
}

前もって感謝します

4

1 に答える 1

5

私はあなたがNSUndoManager間違った機能を得ていると思います。元に戻すマネージャーは、実行したことを元に戻すために必要な呼び出しのスタックのようなものです。したがって、原則として、コレクションオブジェクトを使用してNSArray複数の元に戻すステップを保存するという考えは正しいです。残念ながら、動作が少し異なります。

仕組みNSUndoManager_

元に戻すマネージャーは、メモリ内の元に戻すステップのスタックを維持することによって機能します。元に戻したいサイコロのロールの各ステップについて、- (void)registerUndoWithTarget:self selector:@selector(setMyObjectTitle:) object:currentTitleメソッドを使用して呼び出しオブジェクトを登録します。サイコロを振るたびにこれを行います。一度に 1 つの操作のみを登録してください。

元に戻すには、行ったように undo メソッドを呼び出します。その後、元に戻すマネージャーが元に戻すスタックの操作をポップして実行します。

あなたの主な過ちは、元に戻すマネージャーの仕組みを再発明しようとしたことです。配列を登録しないでください。一度に 1 つのサイコロを振るだけです。

Apple の元に戻すアーキテクチャ マニュアル

于 2011-04-03T16:05:49.950 に答える