MacRuby + Interface Builder:ウィンドウを表示してから閉じてからもう一度表示する方法
-
27-10-2019 - |
質問
私はMacRubyとCocoaを備えた完全なn00bなので、答えるときはそのことを覚えておいてください。多くの詳細と説明が必要です。 :)
2つのウィンドウがあり、どちらもInterfaceBuilderで構築されている単純なプロジェクトを設定しました。最初のウィンドウは、テーブルビューを使用したアカウントの単純なリストです。表の下に「+」ボタンがあります。 +ボタンをクリックすると、「新しいアカウントの追加」ウィンドウが表示されます。
また、AccountsController < NSWindowController
クラスとAddNewAccountController < NSWindowController
クラスがあり、これらのウィンドウのデリゲートとして設定され、適切なボタンクリックメソッドが配線され、必要なウィンドウを参照するためのアウトレットがあります。
[アカウント]ウィンドウの[+]ボタンをクリックすると、次のコードが実行されます: ジェネラコディセタグプレ
これは、最初に[+]ボタンをクリックしたときにうまく機能します。すべてが表示され、データを入力してモデルにバインドすることができます。ただし、新しいアカウントの追加フォームを閉じると、状況が悪化し始めます。
[新しいアカウントの追加]ウィンドウを閉じるときに解放するように設定した場合、2回目に[+]ボタンをクリックすると、ウィンドウはポップアップしますが、フリーズします。ボタンをクリックしたり、データを入力したり、フォームを閉じたりすることはできません。これは、フォームのコードがリリースされたためだと思います。そのため、フォームを処理するメッセージループはありません...しかし、これについては完全にはわかりません。
[新しいアカウントの追加]ウィンドウを閉じたときに解放されないように設定した場合、2回目に[+]ボタンをクリックすると、ウィンドウは正常に表示されて使用できますが、以前に入力したすべてのデータが残っています。 ..以前のAccountクラスインスタンスにバインドされたままです。
何が間違っているのですか? [アカウント]フォームの[+]ボタンをクリックしたときに、[新しいアカウントの追加]フォームの新しいインスタンスを作成し、新しいアカウントモデルを作成し、そのモデルをフォームにバインドしてフォームを表示する正しい方法は何ですか?
...これはすべてOSX10.6.6、64ビット、XCode3.2.4で実行されています
解決
問題は、毎回ウィンドウが作成されないことです。閉じたときに解放するのは少し面倒なオプションであり、通常、ウィンドウが閉じたときにウィンドウコントローラーも解放されていることがわかっている場合にのみ使用されます。 (私はMacRubyを使用したことがないので、正しいことがわかっているのでObj-Cでコードを提供します。変換できるといいのですが、MacRubyではGCがオンになっていると想定します)
これを行うには2つの方法があります。 2つの方法のいずれかである可能性があるため、NIB /クラスがどのように設定されているか完全にはわかりません。
-
これを解決する最初の方法は、フォーム要素を参照するために使用するアウトレットを使用して、ウィンドウを再度表示するときにそれらを空白にすることです(例:[myTextField setStringValue:@ ""])。ココアバインディングを使用している場合は少し注意が必要ですが、基本的には、バインドされたオブジェクトが空白になっていることを確認する必要があります。 Cocoaを初めて使用する場合は、バインディングを使用しないことをお勧めします。
-
2番目の方法は、AddNewAccountControllerクラスをNSWindowControllerのサブクラスにすることです。 +ボタンを押すと、その新しいインスタンスが作成されて表示されます(ivarに保存することを忘れないでください)。そのための最善の方法は次のとおりです。 ジェネラコディセタグプレ
これにより、ウィンドウがすでに表示されている場合に新しいインスタンスが作成されるのを防ぎます。次に、デリゲートを実装する必要があります: ジェネラコディセタグプレ
明らかに、ウィンドウを「AddNewAccountController」と呼ばれる別のNIBに移動する必要があります。このNIBでは、ファイルの所有者のクラスをAddNewAccountControllerに設定してから、ファイルの所有者のウィンドウアウトレットをウィンドウに接続してください。
これらすべてを設定すると、毎回新しいコントローラー/ウィンドウが表示されます。また、ペン先とコントローラーをより焦点を絞ったユニットに分割できるという利点もあります。
-
最後にもう1つ。ウィンドウでこのようなことをするのは問題ありませんが、アカウントの追加ウィンドウが他のウィンドウの後ろに隠れてしまう可能性を防ぐため、最終的にはシートを介してこれを行うことを検討することをお勧めします。