Почему initWithCoder неправильно инициализирует элементы?

У меня есть подкласс UITableViewCell. Мой подкласс содержит несколько UILabel. Я хочу, чтобы мой подкласс инициализировал эти метки некоторыми настройками по умолчанию, которые применяются к каждой моей ячейке табличного представления.

Я читал, что для этого я должен использовать initWithCoder. Моя функция initWithCoder вызывается, и я могу пройтись по каждой строке в моей функции, и кажется, что она проходит через движения. Однако, когда я запускаю свое приложение, я не вижу ни одного из применяемых свойств. Наиболее заметно, что шрифт не меняется. Я просто не думаю, что какие-либо свойства, которые я изменяю на своих UILabel, на самом деле сохраняются или отображаются.

Я использую этот подкласс вместе с Storyboard. Я знаю, что мои изменения не будут отражены в Storyboard, но они также не отражаются при запуске приложения, несмотря на то, что мой код выполняется.

Изменить: я хотел упомянуть, что до попытки переопределить initWithCoder у меня был метод экземпляра в этих подклассах, в котором я запускал эту логику. Я просто вызывал этот метод экземпляра внутри cellForRowAtIndexPath. Этот метод работал, но я подумал, что было бы удобно, чтобы эта логика в этом подклассе выполнялась автоматически.

Любые идеи? Мой код ниже:

#import "ThreadListCell.h"

@implementation ThreadListCell

- (id)initWithCoder:(NSCoder *)aDecoder {

    if ((self = [super initWithCoder:aDecoder])) {

        // adjust the font settings of the title
        self.title.font = [UIFont fontWithName:@"SourceSansPro-Black" size:16];
        self.title.textColor = [UIColor colorWithWhite:0.267f alpha:1.0f];

        // adjust the font settings of the subtitle
        self.text.font = [UIFont fontWithName:@"SourceSansPro-Light" size:14];
        self.text.textColor = [UIColor colorWithWhite:0.267f alpha:0.9f];
        self.text.textColor = [UIColor colorWithRed:1 green:0 blue:0 alpha:1];

        // adjust the font settings of the location
        self.location.font = [UIFont fontWithName:@"SourceSansPro-Light" size:8];
        self.location.textColor = [UIColor colorWithWhite:0.267f alpha:0.9f];

        // adjust the UILabel settings of the title
        self.title.numberOfLines = 0;
        self.title.lineBreakMode = UILineBreakModeTailTruncation;

        // adjust the UILabel settings of the subtitle
        self.text.numberOfLines = 0;
        self.text.lineBreakMode = UILineBreakModeTailTruncation;

        // adjust the UILabel settings of the location
        self.location.numberOfLines = 0;
        self.location.lineBreakMode = UILineBreakModeTailTruncation;
        self.location.textAlignment = UITextAlignmentRight;

    }

    return self;

}

@end

И заголовок:

#import <UIKit/UIKit.h>

@interface ThreadListCell : UITableViewCell

@property (nonatomic, weak) IBOutlet UILabel *text;
@property (nonatomic, weak) IBOutlet UILabel *title;
@property (nonatomic, weak) IBOutlet UILabel *location;

@end

person Ryan    schedule 13.08.2012    source источник


Ответы (1)


Ни один из ваших IBOutlets не установлен, когда вы получаете сообщение — вам нужно использовать «awakeFromNib» или «viewDidLoad» — что-то в этом роде — для доступа к вашим выходам. Тем не менее, вы можете установить другие вещи, не относящиеся к выходу, в файле initWithCoder.

person David H    schedule 13.08.2012
comment
Ох, хорошо. Замена initWithCoder на awakeFromNib работает, как и ожидалось. Большое спасибо! - person Ryan; 13.08.2012
comment
Хотя похоже, что awakeFromNib происходит до того, как я установил какое-либо из своих свойств в cellForRowAtIndexPath. Это заставляет меня думать, что, возможно, мой метод экземпляра был лучшим подходом, потому что я мог надежно выполнять операции изменения размера на основе текущего текста в UILabel и т. д. - person Ryan; 13.08.2012
comment
Порядок должен быть следующим: initWithCoder, awakeFromNib, cellForRowAtIndexPath. Если вам нужно задать некоторые математические значения, вы можете сделать это в подпрограмме инициализации. Но у вас нет доступа к вашим розеткам, пока перо не будет загружено. - person David H; 13.08.2012