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の例
素敵なアプリのようです。幸運を。