Objective C - Custom view and implementing init method?
initwithcoder, initwithframe, objective-c
Solution
The right thing to do in that case is to create another method containing the code that's common to both `-initWithFrame:` and `-initWithCoder:`, and then call that method from both `-initWithFrame:` and `-initWithCoder:`:
- (void)commonInit
{
// do any initialization that's common to both -initWithFrame:
// and -initWithCoder: in this method
}
- (id)initWithFrame:(CGRect)aRect
{
if ((self = [super initWithFrame:aRect])) {
[self commonInit];
}
return self;
}
- (id)initWithCoder:(NSCoder*)coder
{
if ((self = [super initWithCoder:coder])) {
[self commonInit];
}
return self;
}
Do heed the concerns outlined in Justin's answer, particularly that any subclasses must not override `-commonInit`. I used that name here for its illustrative value, but you'll probably want one that's more closely tied to your class and less likely to be accidentally overridden. If you're creating a purpose-built UIView subclass that's unlikely to be subclassed itself, using a common initialization method as above is perfectly fine. If you're writing a framework for others to use, or if you don't understand the issue but want to do the safest possible thing, use a static function instead.
Problem
I have a custom view that I want to be able to initialize both `in-code` and in `nib`. What's the correct way to write both `initWithFrame` and `initWithCoder` methods? They both share a block of code that is used for some initialization.