Почему вы не можете отправлять сообщения на 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 как свойство и инициализируете его в методе init HopBill (вы должны также освободить его в методе dealloc HopBill). Вы должны сделать то же самое для контроллера - у него должен быть экземпляр 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. Или, может быть, вы просто сделаете doc подклассом контроллера, а не используете отдельный класс HopBillSheetController. Я не уверен насчет NSDocument. Но помните, что метод IBAction может сам вызывать другие методы, если он имеет доступ к экземплярам классов, в которых эти методы объявлены.
В Apple есть пример использования методов делегирования табличного представления и протокола источника данных. Перейдите по этой ссылке и загрузите пример кода: пример таблицы
Это выглядит как хорошее приложение. Удачи.