iOS: почему drawRect: вызывается дважды, и почему это значение ivar, по-видимому, меняется безо всякой причины? - PullRequest
0 голосов
/ 18 июля 2011

Я создал подкласс UIView для реализации пользовательского метода drawRect. Поместив несколько логов в код, я обнаружил, что drawRect на самом деле вызывается дважды, так как представление сначала устанавливается его контроллером представления. Почему это?

Другая проблема заключается в том, что у моего подкласса UIView есть ивар с именем needsToDrawTools. Мой назначенный инициализатор для этого подкласса устанавливает значение needsToDrawTools в YES. Затем метод drawRect проверяет это значение. Если ДА, он рисует инструменты, а затем устанавливает значение needsToDrawTools в НЕТ, чтобы никогда не перерисовывать инструменты.

НО, каким-то образом значение needsToDrawTools равно NO к моменту вызова drawRect. Нигде в моем коде я не устанавливаю его на NO, кроме как в операторе if (needsToDrawTools) внутри drawRect. Но так как needsToDrawTools уже NO к моменту, когда он достигает оператора if, код внутри оператора никогда даже не запускается. Если я вообще уберу это утверждение IF, то оно, конечно, запустится, и я увижу, что я ожидаю в представлении. Но я не хочу удалять оператор IF, потому что это приведет к перерисовке вещей, которые не нужно перерисовывать.

Вот мой код:

- (id)initWithParentViewController:(NewPhotoEditingViewController *)vc
{
    self = [super init];
    if (self) {
        parentVC = vc;
        needsToDrawTools = YES;
        NSLog(@"needsToDrawTools: %i",needsToDrawTools); //Console result: 1
    }
    return self;
}

#pragma mark - Drawing

- (void)drawRect:(CGRect)rect
{
    NSLog(@"needsToDrawTools: %i",needsToDrawTools); //Console result: 0  !!!!!
    if (needsToDrawTools){
        NSLog(@"drawingTools"); //Never shows up in the console
        UIBezierPath *toolPointDragger = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(75, 100, 30, 30)];

        [[UIColor blackColor] setStroke];
        toolPointDragger.lineWidth = 6;
        [toolPointDragger stroke];

        [[UIColor blueColor] setFill];
        [toolPointDragger fill];
        needsToDrawTools = NO;
    }
}

Итак, мои два вопроса:

  1. Почему drawRect вызывается дважды? Я предполагаю, что он вызывается в первый раз автоматически как часть процесса загрузки представления, но я не знаю, почему он вызывается снова.

  2. Каким образом needsToDrawTools заканчивается значением NO?

1 Ответ

2 голосов
/ 18 июля 2011

Похоже, у вас есть более одного экземпляра этого представления. Возможно, вы создаете один программно и загружаете его из пера? Objective-C будет устанавливать все ивы на ноль (или ноль, или НЕТ) при создании объекта, и если вы загружаете экземпляр вашего представления из кончика, он не будет инициализирован вашими -(id)initWithParentViewController: и needsToDrawTools должно быть НЕТ для этого представления.

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