Вопрос

Я создаю простой проект для iPhone, используя Xcode и Interface Builder.Хотя я понимаю, что такое делегат, у меня есть проблема с его использованием.

У меня есть UITextField в моем интерфейсе.Он отображает клавиатуру, когда пользователь нажимает на нее, но мне нужно вручную запрограммировать, как скрыть клавиатуру.Это можно сделать с помощью делегатов.Итак, в IB я беру объект из библиотеки, присваиваю ему имя класса как Control1Delegate, а затем подключаю выход делегата из моего текстового поля к этому Control1Delegate.У меня также есть файлы .m и .h для этого класса Control1Delegate :

Control1Delegate.h контроль1delegate.h

@interface Control1Delegate : NSObject <UITextFieldDelegate> {
}

- (BOOL) textFieldShouldReturn:(UITextField *)textField;

@end

Control1Delegate.m контроль1delegate.m

#import "Control1Delegate.h"

@implementation Control1Delegate

- (BOOL) textFieldShouldReturn:(UITextField *)textField {
    [textField resignFirstResponder];
    return YES;
}

@end

Но это не работает.При запуске он просто никогда не достигает метода textFieldShouldReturn или завершается сбоем без msg или с EXEC_BAD_ACCESS .Самое смешное, что когда я перемещаю метод в файл контроллера (тот, который сгенерировал мастер) и подключаюсь из UITextField к этому контроллеру (владельцу файла), все работает, как ожидалось.Я видел, что большинство руководств по кодированию Apple помещают делегированные методы в случайные объекты, а не в отдельный класс - я хотел бы знать, почему.Разве я не могу иметь делегат в отдельном классе?

Чего мне здесь не хватает?Какой-то нулевой указатель?Жизненный цикл объекта?

Это было полезно?

Решение

Ваш объект Control1Delegate уничтожается вскоре после его создания.Все объекты верхнего уровня Nib должны быть сохранены, если вы хотите сохранить их живыми.Обратитесь к Руководство по программированию ресурсов:Жизненный цикл объекта Nib.

Владелец файла мог бы обладать таким свойством, как это, чтобы сохранить объект:

@property (nonatomic, retain) IBOutlet Control1Delegate *control1delegate;

Не забудьте освободить объект после того, как он больше не понадобится.

Другие советы

Вы можете поместить методы делегирования в любой класс, включая тот, который создан специально для этой цели.Причина, по которой Apple (и другие программисты) обычно не создают классы специально для функций делегирования, заключается в том, что становится чрезмерно сложно обмениваться данными.Например, в одном из моих проектов я мог бы создать подкласс Window Controller, который обрабатывает методы делегирования из окна, табличное представление внутри окна и панель инструментов окна.Все, что вам нужно для управления этим окном и поддержания его состояния, находится в одном классе контроллера.Теперь представьте себе три отдельных класса (плюс, вероятно, класс контроллера для управления ими), выполняющих одни и те же функции - это большая дополнительная работа без какой-либо реальной пользы.

Что касается причины сбоя, похоже, вы допускаете ошибку с управлением памятью где-то еще в вашем приложении.Вы можете использовать отладчик, чтобы точно отследить, откуда он берется.

Спасибо вам обоим.Теперь я не только знаю, как решить мою проблему, но и, наконец, понял, как объекты сохраняются в процессе создания Nib.Недостаточно создать объект в IB, если это новая сущность, она должна быть подключена к реальному ivar в владельце файла (с правильно синтезированным средством получения / установки).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top