2013-03-07 2 views
23

Я пытаюсь подкласс UIView. У меня уже есть назначенный инициализатор, и я хочу иметь возможность для инициализации моего пользовательского представления либо из кода, либо из файла Nib. Итак, Apple сообщила нам использовать назначенный инициализатор, но они не делают этого сами - initWithCoder: не вызывает initWithFrame:. Что я должен сделать, чтобы назначить назначенный инициализатор в обеих ситуациях? Нет ли способа сделать это?Как переопределить initWithFrame: и initWithCoder: в подклассе UIView?

+0

Взгляните сюда, пожалуйста, и увидеть образец кода http://stackoverflow.com/a/17798646/381807 – nesimtunc

ответ

39

Упакуйте специальную инициализацию одним способом. Он может быть закрытым (объявлен в .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; 
} 
+0

мы не должны включать '- (instancetype) init' инициализаторе ..? На всякий случай. Я новичок в объекте C. – shashwat

+0

Не нужно - подклассы 'UIView' редко инициализируются _simple_' init'. В тех же случаях может иметь смысл включить 'init' также - то есть: если определенный тип представления обычно инициализируется фиксированным фреймом или что-то в этом роде. –

5

Как вы сказали:

initWithFrame: - Рекомендуется, чтобы реализации этого метода. Вы также можете использовать специальные методы инициализации в дополнение к или вместо этого метода.

initWithCoder: - Внедрите этот метод, если вы загрузите свой вид из файла nib-файла с интерфейсом Builder, и для вашего представления требуется пользовательская инициализация .

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

Смежные вопросы