К сожалению, приведенные выше ответы не учитывают следующие вещи:
- (void) awakeAfterUsingCoder - и тот факт, что он вызывается после того, как что-либо создано кодером (один раз для каждого представления Xib).
Я заметил, что awakeFromNib страдает от той же участи. (Причина, по которой я нашел это)
Еще одна проблема с инициализацией заключается в том, что для пользовательских представлений можно избежать initWithCoder и initWithFrame. И если они называются, ленивая загрузка (хотя это и не так важно для самих представлений), это означает, что вы «можете» изменять значения. Я полагаю, что я сделал это в initWithCoder, но если вы затем инициализируете значения в awakeFromNib, он отменяется хотя бы один раз.
Я зашел так далеко, что:
- (void) awakeFromNib (or didMoveToSuperView);
{
BOOL called = NO;
if(!called)
{
called = YES;
}
}
Другой метод, который я использую, - это просто вызвать необходимый инициализатор, а затем вызвать мой собственный класс или специфичный для суперкласса инициализатор.
Я тоже ищу надежное единовременное место, на которое я могу положиться. До тех пор, я надеюсь, мои головные боли спасут следующего человека примерно на час.
Steve