Как правильно настроить различные объекты в качестве делегатов с помощью Interface Builder? - PullRequest
0 голосов
/ 20 марта 2010

Допустим, я создаю новый проект. Теперь я добавляю два текстовых поля в контроллер представления в Интерфейсном Разработчике. Я хочу отвечать на события делегата, создаваемые текстовыми полями, однако я не хочу, чтобы контроллер основного вида выступал в качестве делегата для обоих текстовых полей. В идеале я хочу отдельный файл для каждого текстового поля, которое выступает в качестве делегата. Каждый из этих объектов также должен иметь возможность взаимодействовать с контроллером основного вида.

У меня вопрос, как бы я это настроил и все правильно связал?

Я попытался создать новый класс, который наследуется от NSObject и реализует UITextFieldDelegate. Затем я добавил переменную экземпляра с именем «viewController» того же типа, что и мой контроллер представления, и пометил его с помощью IBOutlet (для этого мне понадобилось добавить #import «myViewcontroller.h»).

Затем я подошел к Интерфейсному Разработчику и открыл свой контроллер представления, который содержит два поля редактирования. Я добавил объект NSObject в форму и изменил его тип на новый созданный класс. Я установил его свойство viewController на Владелец файла и установил одно из свойств делегата текстового поля, чтобы оно указывало на этот новый объект, который я создал.

Теперь, когда я запускаю программу, она падает, когда я касаюсь текстового поля. Выдает ошибку EXC_BAD_ACCESS. Я предполагаю, что я не связал вещи правильно в IB.

Некоторые вещи, в которых я не уверен, в чем может быть проблема:
Знает ли IB автоматически, что нужно создать экземпляр класса, просто поместив объект NSObject в ViewController? Может ли он должным образом назначить свойство viewController самому экземпляру, даже если он создает себя в то же время? Может быть, проблема в том, что этот новый объект ничем не удерживается?

1 Ответ

2 голосов
/ 20 марта 2010

Вы правы. Ваш объект делегата не сохраняется. В iPhone OS каждый объект в файле пера инициализируется с счетом сохранения 1, а затем автоматически высвобождается. Если объект снова ничего не удерживает, он в конечном итоге будет освобожден.

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

...