問題タブ [nsundomanager]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
126 参照

ipad - 元に戻すためのシェイクを防止する UIPopover

さまざまな状況でテキスト入力を可能にするアプリがあります。テキストが UIPopover 内の UITextView または UITextField に入力されると、シェイクによる取り消しが機能しません。デバイス (またはシミュレーター) を振ると、元に戻すかどうかを尋ねる UIAlertView が表示されません。

UIPopovers に含まれていない UITextFields がある場合、振ると元に戻すことが期待どおりに機能します。

テキスト入力フィールドが UIPopover 内にある場合、シェイクして元に戻すことができなくなる原因は何ですか?

私の展開ターゲットは iOS 5.1 です

0 投票する
1 に答える
478 参照

objective-c - ブロックを含む NSUndoManager

私がブロックをサポートすることを期待するすべてのものの中で、不思議なことに NSUndoManager はサポートしていないようです。これには何らかの固有の理由があるのでしょうか、それとも Apple は単にこの API のビットを最新化することに取り組まなかったのでしょうか?

特に、NSObject でメソッドを定義したいと思います。

電話できるようにするには、

私は何かを逃しましたか?これに問題はありますか?

(2009 年の Mike Ash の記事に触発され、ブロックでメソッドを定義しないことを推奨しています。私もそこにコメントを残しました。)

0 投票する
2 に答える
1282 参照

ios - CoreData が NSUndoManager で例外をスローする

Core Data で NSUndoManager を使用している iPad アプリがあります。数回元に戻す/やり直すと、ある程度再現可能なバグがあることを除いて、通常はうまく機能します。私はメインスレッドでのみ作業しています (少なくとも、MagicalRecords がセカンダリスレッドで NSManagedObject を使用するのを無効にしました。コンテキストへの NSManagedObject の挿入を元に戻したりやり直したりしようとすると、常に問題が発生します。

だから私はこのようなものを持っています:

そして数回後、次の例外が発生します。これはセカンダリ スレッドで発生するため、Core Data がバックグラウンドで何かを実行していると思われます。

時々私はEXEC_BAD_ACCESSも取得していますが、それ以外の場合は上記の例外だけです。

何がこれを引き起こしているのでしょうか?

編集:ムンディの状況を明確化(コメントを参照)

0 投票する
0 に答える
109 参照

multithreading - 変更が常に一時的な子コンテキストで行われる場合にコアデータの変更を元に戻す

私のMacアプリケーションは、次のようにメインスレッドからモデルに常に変更を加えるように設定されています。

  1. 別のスレッドで変更を加える(独自のコンテキストで)
  2. バックグラウンドで保存します。これにより、メインスレッドの親コンテキストに変更がプッシュされます
  3. UIの更新をトリガーする通知を投稿する
  4. スレッドが終了します

これは非常にうまく機能しますが、今、私が行った変更に対して元に戻るを有効にしたいです。どうすればこれを行うことができますか?私は2つの等しく悪いオプションしか見ません:

  1. ユーザーが元に戻したい場合に備えて、子コンテキストとその元に戻るマネージャーを保持します。これにより、元にできる元にできる数が制限されます。元に戻すためにコンテキストのスタックを手動で保持するのは奇妙に思えるからです。
  2. または、子コンテキストのUNDOマネージャーを親コンテキストのUNDOマネージャーに設定できますか?そのため、アプリケーションには常に1つのUNDOマネージャーのみが存在します。管理対象オブジェクトが異なるスレッド間で共有されることを想定していないため、これも間違っているように聞こえます。

誰かアイデアはありますか?

ありがとう。

0 投票する
3 に答える
1763 参照

uitextview - UITextViewアンドゥマネージャーが置換属性文字列で機能しない(iOS 6)

iOS 6は、リッチテキスト編集にUITextViewを使用するように更新されました(UITextViewは、属性付きテキストプロパティを取得するようになりました。これは愚かなことに変更できません)。これは、NDAの下でiOS 6 Appleフォーラムで尋ねられた質問です。これは、iOS 6が公開されたため、公開することができます...

UITextViewでは、フォントの変更を元に戻すことはできますが、ビューの属性付き文字列のコピーの置換を元に戻すことはできません。このコードを使用する場合...

...元に戻すことはうまく機能しています。

しかし、結果をビューに表示するために行を追加すると、undoManagerは「replace:with:」メソッドを起動しません...

何か案が?行"2"で使用しようとしたMutableAttributedStringについて、範囲を使用するかどうかに関係なく、どの置換メソッドでも同じ問題が発生します。

0 投票する
1 に答える
1644 参照

uitextview - リッチ UITextView で NSUndoManager を使用して操作を元に戻す (iOS 6)

リッチ UITextView (iOS 6) の属性付きテキストの一部またはすべてを変更し、ユーザーが変更を元に戻せるようにしたいと考えています。

NSUndoManager documentationを読んだ後、最初の方法を試しました:

元に戻す操作は次のように単純であると予想していました:
このメソッドを宣言します:

次を呼び出して、UITextView のテキストを変更します。

しかし、それを行った後、NSUndoManager は元に戻すことができないと言います。




だから私は2番目の方法を試しました:

これを宣言します。

テキストを次のように変更します。

その後、NSUndoManager も元に戻せないと言います。

なんで?

属性付きテキストを変更するコードをトリガーするとき、ユーザーは UITextView を編集していることに注意してください。




回避策は、UITextInput プロトコル メソッドを介してテキストを直接置き換えることです。次のメソッドは非常に便利ですが、NSAttributedString に相当するものは見つかりませんでした。私はそれを逃しましたか?

ここで提案されているハックは、貼り付け操作をシミュレートすることです。可能であれば、これを避けたいと思います(理由はまだありません。後で噛まれないようにするには、あまりにも汚いと感じているだけです)。

0 投票する
1 に答える
583 参照

objective-c - Core Data UndoManager が奇妙な NS を送信する

私が取り組んでいるアプリでは、ユーザーがいくつかのアセットを管理できます。ユーザーは、画面上でアセットを作成/削除/編集/分割/移動できます。ユーザーは、これらすべてのステップを元に戻すことができる必要があります。

アセットはコア データで管理されます (はい、undoManagerインスタンス化されます)。

これらのアクションごとに、次のペアで元に戻すグループを作成します。

edit についても同じことを行います。ユーザーが編集をキャンセルした場合は、 の直後に undo を呼び出しますendUndoGrouping

1 つの例外を除いて、すべてが正常に機能します。私が作成したグループの他に、Core Data によって作成された、私が制御できない他のグループがあります。これが私が意味することです:

次のように NSUndoManagerDidCloseUndoGroupNotification 通知を受け取るように登録しました。

これらの通知を使用して元に戻すボタンを更新し、何らかのアクションの結果として元に戻されているアクションの名前を表示します: Undo Split など

それでも、didCloseUndoGroup上記のアクションごとに 2 回呼び出されたり、通知されたりします (例: endUndoGrouping の後のセクション 1):

最初の通知の時点では、self.managedObjectContext.undoManager.undoActionName私が設定した元に戻すアクションの名前が含まれていますが、2 回目undoActionNameは空の文字列です。

回避策として、名前が空の操作を単純に元に戻して (それらが私のものではなく、必要がないと仮定して)、何か不足していないかどうかを確認しようとしました。

さて、didCloseUndoGroupこんな感じ

そして、魔法のように機能します。「元に戻す」を使用して、任意のコマンド、任意の数のレイヤーを元に戻すことができます。しかし、これはうまくいくはずの方法ではありません...

その前に私が試した他のいくつかのこと:

  1. [self.managedObjectContext processPendingChanges] グループを開く前に。まだ2つの通知を送信していました。
  2. 私が試した別のことは、disableUndoRegistration / enableUndoRegistration でした。これは例外を生成しました:「無効な状態です。ネストされた元に戻すグループが多すぎる状態で元に戻すが呼び出されました」

上記のどれも、前に述べた謎のグループを「分離」するのに役立ちませんでした。

NSUndoManagerDidCloseUndoGroupNotification 通知を 2 回受け取るべきではありません。または、私はすべきですか?この状況に対処するためのより良い方法はありますか?

更新 これが最終的に機能したものです。以前は、通知を受け取るとすぐに名前のないグループを自動的に取り消していました。これが問題の原因です。ここで、ターゲット グループに到達するまですべてを元に戻し、その後、そのグループの最後の元に戻します。

「undoManagerHelper」は、スタックにプッシュされるコマンドごとに一意の ID を生成する単なるスタック管理システムです。この一意の ID を使用して、グループに名前を付けます。

0 投票する
1 に答える
276 参照

objective-c - ブロック内でのNSUndoManagerの使用

ブロックコードに元に戻す/やり直しを追加しようとしています(NSOpenPanelからいくつかのファイルをインポートします)。コードがブロックに由来する限り、メインコードは機能しますが、NSUndoManagerコードは保存されず、エラーは発生しません。NSUndoManagerコードは、ブロック内にない限り、他の場所でも機能します

NSUndoManagerコードの例は次のようになります。

以下は、コードが機能する場所と機能しない場所を示しています。

0 投票する
2 に答える
526 参照

objective-c - NSUndoManager が「restore」メソッドを繰り返し呼び出す

私はUITextView書式設定ツールバーを持っています。「太字」ボタンを押すと、テキスト/選択が変更され、操作がテキスト ビューの に登録されますNSUndoManager

元に戻そうとするrestoreText:と、アプリを強制終了するまで何度も呼び出されます

サンプルコード:

そしてコンソール:

[self.textView.undoManager isUndoing]で呼び出しを登録する前にチェックしようとしましrestoreText:withRange:たが、クラッシュします:

このコードは iOS5 では機能していましたが、iOS6 では機能しなくなりました。Apple にバグを報告しましたが、何か問題があるかどうかわかりません

0 投票する
1 に答える
423 参照

cocoa - NSUndoManagerは引数を保持しますか?

以下は、AaronHillegasによるOSX用の本cocoaプログラミングからの取り消しを有効にするためのコードです。

従業員を削除しているときに、コマンドをUNDOスタックにプッシュして、その従業員を配列に再挿入します。しかし、undoが呼び出されたときにpが解放されないという保証はありますか?