UIView drawRect против initWithFrame - PullRequest
2 голосов
/ 30 июля 2010

У меня есть UIView, в который добавлено несколько кнопок в качестве подпредставлений. В настоящее время у меня есть кнопки в drawRect:, что, как я слышал, является плохой идеей, потому что drawRect может вызываться несколько раз. Я пытался переместить эти кнопки UIB в initWithFrame, но они просто не отображаются. Как мне это исправить?

Я не использую конструктор интерфейса, поэтому нет файлов NIB. Вызывается initWithFrame. Я проверил, добавив NSLog (...), и мои NSMutableArrays правильно инициализируются.

Мой initWitFrame: кода в настоящее время очень мало. Это

- (id)initWithFrame:(CGRect)frame 
{
    if (self = [super initWithFrame:frame]) 
    {
        results = [[NSMutableArray alloc] init];
        inputs = [[NSMutableArray alloc] init];
        format = [[NSDateFormatter alloc] init];
        [format setDateFormat:@"EEE, MMM dd, yyyy"];
        renc =[[RenameController alloc] init];
    }
    return self;
}

Я попытался добавить текстовую метку, как показано ниже

#define BOX_WIDTH 155.0
#define BOX_OFFSET 45.00
#define ROW_HEIGHT 27

- (id)initWithFrame:(CGRect)frame 
{
    if (self = [super initWithFrame:frame]) 
    {
        results = [[NSMutableArray alloc] init];
        inputs = [[NSMutableArray alloc] init];
        format = [[NSDateFormatter alloc] init];
        [format setDateFormat:@"EEE, MMM dd, yyyy"];
        renc =[[RenameController alloc] init];

        double row=0.0;
        [self makelabel:@"Start" at:CGRectMake(0, row, BOX_OFFSET, ROW_HEIGHT)];
    }
    return self;
}

-(void) makelabel:(NSString *) str at:(CGRect) rect
{
    UILabel *title = [[UILabel alloc] initWithFrame:rect];
    title.text = str;
    title.textAlignment = UITextAlignmentLeft;
    title.textColor = [UIColor blackColor];
    title.backgroundColor = [UIColor clearColor];
    title.font = [UIFont boldSystemFontOfSize:FONT_SIZE];
    [self addSubview:title];
    [title release];
}

Ответы [ 2 ]

7 голосов
/ 30 июля 2010

@ tonklon находится на месте.Кроме того, обычным шаблоном является добавление пользовательского кода инициализации в третий метод, например -sharedInit, который вызывается после соответствующего super initializer:

- (id)sharedInit {
    // do whatever, possibly releasing self on error and returning nil
    return self;
}

- (id)initWithFrame: (CGRect)frame {
    self = [super initWithFrame: frame];
    if (self) {
        self = [self sharedInit];
    }
    return self;
}

- (id)initWithCoder: (NSCoder *)aDecoder {
    self = [super initWithDecoder: aDecoder];
    if (self) {
        self = [self sharedInit];
    }
    return self;
}
2 голосов
/ 30 июля 2010

Бьюсь об заклад, вид загружается из файла пера? Просто используйте тот же код, чтобы добавить свои подпредставления в initWithCoder:

Описание класса UIView:

Если вы используете Interface Builder для проектирования ваш интерфейс, этот метод не вызывается, когда ваши объекты просмотра впоследствии загружен из файла пера. Объекты в файле пера воссоздан и затем инициализирован используя их initWithCoder: метод, который изменяет атрибуты посмотреть, чтобы соответствовать атрибутам, хранящимся в файл пера. Для подробной информации о том, как представления загружаются из пера файл, см. Руководство по программированию ресурсов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...