Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Function that is called when UILabel initializes

I am trying to subclass UILabel. The first try involves that my custom UILabel simply sets the property adjustsFontSizeToFitWidth to YES. The problem is that I am new to iOS programming and unsure about where to put this code. I tried the code below but they are never called.

- (id)initWithFrame:(CGRect)frame
{
NSLog(@"init custom label");
self = [super initWithFrame:frame];
if (self) {
    // Initialization code
    self.adjustsFontSizeToFitWidth=YES;
}
return self;
}

- (id)init
{
NSLog(@"init custom label");
self = [super init];
if (self) {
    // Initialization code here.
    self.adjustsFontSizeToFitWidth=YES;
}

return self;
}

I got it to work by using:

lblCustom = [lblCustom init];

But is there someway I can get this call to be called automatically?

like image 829
user1354603 Avatar asked Jun 01 '26 18:06

user1354603


2 Answers

When a label is used in interface builder is then the coded use the NSCoder protocol:

- (id)initWithCoder:(NSCoder *)aDecoder
{
    NSLog(@"init custom label");
    self = [super initWithCoder:aDecoder];
    if (self) {
       // Initialization code here.
       self.adjustsFontSizeToFitWidth=YES;
    }
    return self;
}

What I do, is create one method to setup my custom UI object and let all the init call this method.

like image 175
rckoenes Avatar answered Jun 03 '26 11:06

rckoenes


I would personally stay away from initWithCoder: and instead use awakeFromNib instead. Here is why (Apple UIKit Documentation):

The nib-loading infrastructure sends an awakeFromNib message to each object recreated from a nib archive, but only after all the objects in the archive have been loaded and initialized. When an object receives an awakeFromNib message, it is guaranteed to have all its outlet and action connections already established.

I have a variety of UI subclasses in my program and here is the solution I came up in my BaseLabel class.

- (id)initWithFrame:(CGRect)frame 
{
    self = [super initWithFrame:frame];

    if(self)
    {
        // We were not loaded from a NIB
        [self labelDidLoad:NO];
    }

    return self; 
}

- (void)awakeFromNib 
{
    [super awakeFromNib];

    // We were loaded from a NIB
    [self labelDidLoad:YES]; 
}

- (void)labelDidLoad:(BOOL)loadedFromNib
{
    // Do some initialization here...
}

Now all of my subclasses simply override {type}didLoad:(BOOL)loadedFromNib.

For example buttonDidLoad:, textFieldDidLoad:, and tableViewDidLoad: (you get the idea).

like image 20
Erik Avatar answered Jun 03 '26 13:06

Erik



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!