Как отправить действия для целей, отличных от владельца файла? - PullRequest
0 голосов
/ 05 февраля 2010

Я пытаюсь отправить действия от прикосновений к кнопке на контроллер, отличный от того, который действует как владелец файла. У меня есть четыре отдельных области экрана, которыми я хотел бы управлять с помощью четырех отдельных контроллеров (buttonController, toolbarController, textController и graphicController) с пятым контроллером (mainController), управляющим другими четырьмя. mainController также связан с владельцем файла. Получить нажатия кнопок, которые будут обрабатываться mainController, легко:

Файл MainController.h:

- (IBAction)buttonIsTouched:(id)sender;

Файл MainController.m:

- (IBAction)buttonIsTouched:(id)sender {
    ..handle button touch event etc.
}

Затем в Интерфейсном Разработчике свяжите событие Touch Down с владельцем файла, выберите buttonIsTouched и все, что нужно. Все работает отлично. Однако, когда я делаю то же самое для контроллера, который не является контроллером Владельца Файла, происходит сбой приложения. Вот что я сделал:

Создание четырех контроллеров в качестве переменных экземпляра mainController. Создайте их в -[MainController viewDidLoad]. Укажите метод обработки кнопок точно так же, как указано выше. В Интерфейсном Разработчике перетащите шаблон Объекта из Библиотеки (четыре раза) в браузер mainController.xib. Установите тип для этих объектов ButtonController, ToolBarController, TextController и GraphicsController соответственно. Свяжите событие Touch Down с объектом ButtonController и выберите запись buttonIsTouched (в маленьком всплывающем окне) Создайте и запустите приложение Нажмите кнопку Сбой - извините, я не записал код ошибки, но он был похож на INVALID_ACCESS

Конечно, я могу сделать так, чтобы все входные данные сначала отправлялись в mainController, а затем делегировались каждому отдельному контроллеру, но это кажется неэффективным решением, особенно потому, что я хочу, чтобы нижние контроллеры выполнили некоторую работу перед передачей сообщений в mainController. Необходимость пройти через mainController, а затем вернуться назад, если меня это раздражает.

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

ас

1 Ответ

1 голос
/ 05 февраля 2010

Одной из проблем вашего подхода является то, что вы создаете два объекта для каждого из ваших четырех субконтроллеров ButtonController, ToolBarController, TextController и GraphicsController. Вы создаете контроллеры программно в viewDidLoad, но они уже были созданы из загруженного пера.

Вы не должны создавать контроллеры в viewDidLoad, а вместо этого использовать сохраняющие свойства IBOutlet в вашем MainController, чтобы соединить их в IB.

Тогда объекты контроллера принадлежат MainController и не удаляются после загрузки пера. Это также удалит вашу ошибку памяти.

...