Объект (содержащий NSMutableArray) имеет различное содержимое в родительском / дочернем классе - PullRequest
1 голос
/ 19 июня 2011

У меня есть классы: HopBill, HopBillController и HopBillSheetController.HopBill создает объект, содержащий NSMutableArray.В целях тестирования я уже добавил строку в массив в методе init HopBill.HopBillController.h имеет #import "HopBill.h", а HopBillController.m инициализирует объект в методе awakeFromNib: aHopBill = [[HopBill alloc] init];.Все идет нормально.Из HopBillController.m я могу вызывать методы для объекта aHopBill.Он извлекает строку, вставленную в init и т. Д.

HopBillSheetController является дочерним элементом HopBillController и в основном представляет собой лист, который всплывает после нажатия кнопки.И после заполнения некоторых полей необходимо добавить строку в aHopBill и закрыть лист.В HopBillSheetController у меня есть:

#import "HopBillController.h"

@interface HopBillSheetController : HopBillController {

Я могу всеми методами из HopBillSheetController.m получить строку, вставленную в init.Все вроде нормально.Однако, когда я заполняю поля на листе и жму OK (чтобы добавить строку в aHopBill), HopBillSheetController вызывает метод в HopBillController: [super addHopAddition: [variety stringValue]];.Строка добавляется, но когда я извлекаю все строки из aHopBill в HopBillController.m, она возвращает только строку, вставленную в init aHopBill.Когда я делаю то же самое с листа, он возвращает строку, вставленную в init aHopBill, и строку, которую я только что добавил на лист.

Это как если бы у меня было два объекта aHopBill, но, очевидно, это должен быть одинобъект.Что я делаю не так?

1 Ответ

2 голосов
/ 19 июня 2011

Вы путаете иерархию классов с иерархией объектов пользовательского интерфейса.Наследование от класса не то же самое, что и дочернее окно.

Ваш класс HopBillSheetController в настоящее время наследует от HopBillController.Это означает, что он фактически имеет свой собственный экземпляр HopBillController как super.Этот экземпляр полностью отделен от экземпляра, связанного с вашим окном.Изменения одного не повлияют на другое, как вы уже нашли.

Это совсем не то, что вы хотите.Вы хотите связать фактические объекты , а не структуру класса.То, как вы это сделаете, зависит от того, как создается и структурируется вся установка, но, вероятно, все сводится к одной или другим из следующих опций:

  • Если вы объединяете пользовательский интерфейс вИнтерфейсный конструктор (или как мы его сейчас называем), вам нужно вставить соответствующие переменные экземпляра IBOutlet в ваши классы и установить связи между ними с помощью инструментов пользовательского интерфейса.

  • Если вы делаетесоединения в коде, вам нужно добавить свойства (или другие подходящие методы доступа), чтобы код в одном классе мог получить необходимые экземпляры объектов в другом.

В любом случае,вы должны потерять ложное наследство между двумя классами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...