Почему вы не можете отправлять сообщения на 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 в качестве свойства, и этот экземпляр должен быть инициализирован в методе инициализации контроллера.
Если вы хотите, чтобы 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, я подозреваю, что вместо этого вы поместите вывод tableview в подкласс NSDocument. И вы бы дали этому подклассу документа свойство, которое является экземпляром контроллера. Методы IBAction также будут в подклассе doc, поэтому у них будет доступ к контроллеру и его свойству HopBill. Или, может быть, вы просто сделаете подкласс doc контроллером, вместо того, чтобы использовать отдельный класс HopBillSheetController. Я не уверен насчет NSDocument. Но помните, метод IBAction может сам вызывать другие методы, если он имеет доступ к экземплярам классов, в которых объявлены эти методы.
У Apple есть пример, использующий методы делегата tableview и протокола источника данных. Перейдите по этой ссылке и загрузите пример кода: пример tableview а>
Похоже, хорошее приложение. Удачи.
person
Wienke
schedule
12.06.2011