1

私の文書ベースのアプリケーションには、テーブルビューを持つウィンドウがあります。tableview には、NSMutableArray (aHopBill) と必要な tableview メソッドを含む NSObject (HopBill と呼ばれる) 型のクラスを指すデータソースがあります。ここまでは順調ですね。

テーブルビューに行を追加するために、NSWindowController (HopBillSheetController と呼ばれる) から制御されるシートを追加しました。シートのOKボタンを押したとき。実際には 2 つの IBActions を実行する必要があります (これは不可能です): tableview の配列に行を追加し、シートを閉じます。シートの OK ボタンを NSWindowController に接続する (シートを閉じる) か、NSObject に接続する (配列に行を追加する) ことができます。しかし、私は両方が欲しい:-)

NSObject から NSWindowController の IBAction を呼び出すことは可能ですか? または、これを行う別の方法はありますか?

私は Cocao と Objective-C の初心者なので、お手柔らかにお願いします :-)

4

2 に答える 2

1

シートが NSPanel を含む nib/xib である場合、シートを閉じる呼び出しは単純に [panel close] です。ウィンドウ コントローラにパネルのプロパティがあると仮定すると、行を追加する IBAction の最後にクローズ コードを配置できます。または、必要に応じて IBAction 自体で別のメソッドを呼び出すこともできます。

パネルがモーダルで実行されている場合は、stopModal も必要になる場合があります。(これは、パネルを閉じた後もすべてがフリーズしたままである場合に必要です。それ以外の場合は気にしないでください。)

データ ソースである hopBill がウィンドウ コントローラーのプロパティであると仮定すると、ウィンドウ コントローラーに記述した IBAction も hopBill にアクセスできます。それはあなたが必要とするすべてを行うことができます。

したがって、単一の IBAction をウィンドウ コントローラーに追加し、パネルの [OK] ボタンをそれに接続します。それはうまくいくはずです。

nib 内のコントロール以外の場所から IBAction を呼び出すことに関しては、はい、それを行うことができます。コントロールへの参照を送信側引数として使用するか、IBAction が送信側引数を使用しない場合は nil を使用します。

プログラムでパネルを作成するか、NSAlert を使用することもできます。しかし、あなたの現在のセットアップはよりシンプルであるように思えます。したがって、より優れています。


アプリ コントローラーのこの h ファイルを見てください: Apple の ClockControl の例

NSMutableArray *appointments プロパティは、NSTableViewDataSource プロトコル メソッドによって使用される実際のデータ ソースです。IBAction の「addAppointment」は、「予定」に直接アクセスできます。 [self.appointments addObject:whatever atIndex:whatever];

ClockControl の例は、HopBill を使用するように変更できます。その宣言を一番上にインポートします。 #import "HopBill.h" そして、「予定」プロパティの代わりに、HopBill *hopBill; を宣言します。そして、「addApointment」は次のように HopBill の変更可能な配列 (aHopBill) にアクセスします。

于 2011-06-10T20:19:41.117 に答える
0

hopBillにメッセージを送信できない理由:

まず、宣言しても初期化しないためです。あなたが持っている:

HopBill *hopBill;
[self.hopBill.aHopBill addObject: bHopAdditionAtInit];

そのはず:

HopBill *hopBill = [[HopBill alloc] init];
[hopBill.aHopBill addObject: bHopAdditionAtInit]; // “self” won’t work here

次に、 IBActionメソッド(doneHopBillSheet :)で宣言しているため、このメソッド内でのみアクセス可能なローカル変数です。HopBillがテーブルのデータソースキャッシュを保持している場合、それはNSTableViewDataSourceProtocolメソッドを実装するコントローラーのプロパティである必要があります。

HopBillインターフェースで、aHopBill配列をプロパティとして宣言し、HopBillのinitメソッドで初期化します(HopBillのdeallocメソッドでも解放する必要があります)。コントローラに対しても同じことを行う必要があります。プロパティとしてHopBillのインスタンスが必要であり、そのインスタンスはコントローラのinitメソッドで初期化する必要があります。

HopBillControllerでテーブルビューを管理する場合、そのインターフェイス宣言は次のようになります。

@interface HopBillSheetController : NSWindowController <NSTableViewDelegate, NSTableViewDataSource> {
…
}

そしてもちろん、関連するNSTableViewDelegateメソッドとNSTableViewDataSourceメソッドを実装する必要があります。

また、コントローラーにはテーブルビュー自体のIBOutletプロパティが必要であり、コントローラーのawakeFromNibメソッドでは、コントローラーをデリゲートおよびデータソースとして割り当てる必要があります。

[self.tableview setDelegate:self];
[self.tableview setDataSource:self];

(セルフドット構文は、テーブルビュー用に@propertyおよび@synthesizeコードを設定していることを前提としています。)

テーブルにアイテムを追加するIBActionメソッドは、そのコントローラークラス、またはコントローラークラスのインスタンスであるプロパティを持つクラスに含まれている必要があります。次に、IBActionメソッドはaHopBill配列にアクセスし、新しいオブジェクトを配列に追加できます。その後、[tableView reloadData]を呼び出します。これにより、tableviewプロトコルメソッドがトリガーされ、テーブルが更新されます。

つまり、テーブルビューを含むxibには、ファイルの所有者としてコントローラーが必要です。NSDocumentを使用しているので、代わりに、テーブルビューアウトレットをNSDocumentサブクラスに配置すると思います。そして、そのdocサブクラスにコントローラーのインスタンスであるプロパティを与えます。IBActionメソッドもdocサブクラスに含まれるため、コントローラーとそのHopBillプロパティにアクセスできます。または、個別のHopBillSheetControllerクラスを使用するのではなく、単にdocサブクラスをコントローラーにすることもできます。NSDocumentについてはよくわかりません。ただし、IBActionメソッドは、それらのメソッドが宣言されているクラスのインスタンスにアクセスできる限り、それ自体が他のメソッドを呼び出すことができることを忘れないでください。

Appleには、テーブルビューデリゲートメソッドとデータソースプロトコルメソッドの両方を使用した例があります。このリンクにアクセスして、サンプルコードをダウンロードします:tableviewの例

素敵なアプリのようです。幸運を。

于 2011-06-12T15:29:02.033 に答える