Я пытаюсь подклассифицировать UIView. У меня уже есть назначенный инициализатор, и я хочу иметь возможность для инициализации моего пользовательского представления либо из кода, либо из файла Nib. Итак, Apple сообщила нам использовать назначенный инициализатор, но они не делают этого сами - initWithCoder:
не вызывает initWithFrame:
. Что я должен сделать, чтобы назначить назначенный инициализатор в обеих ситуациях? Нет ли способа сделать это?
Как переопределить initWithFrame: и initWithCoder: в подклассе UIView?
Ответ 1
Перенесите свою специальную инициализацию одним способом. Он может быть закрытым (объявлен в .m). Затем переопределите оба инициализатора и вызовите ваш init-метод из них.
- (void)myInitialization
{
//do your stuff
}
- (id)initWithFrame:(CGRect)aRect
{
self = [super initWithFrame:aRect];
if (self)
{
[self myInitialization];
}
return self;
}
- (id)initWithCoder:(NSCoder*)aDecoder
{
self = [super initWithCoder:aDecoder];
if (self)
{
[self myInitialization];
}
return self;
}
Ответ 2
Как вы сказали:
initWithFrame: - Рекомендуется использовать этот метод. Вы также могут реализовывать пользовательские методы инициализации в дополнение к а не этот метод.
initWithCoder: - Внедрите этот метод, если вы загружаете свое представление из Интерфейсный файл с интерфейсом Builder и ваше представление требуют инициализации.
Что бы я делал, это просто метод, который оба вызывали бы, у которого было бы обычное поведение, которое вы хотите реализовать в своем UIView
.