Как работает setNeedsLayout? - PullRequest
4 голосов
/ 17 октября 2011

Я хотел бы знать, как работает Apple -setNeedsLayout.

Я уже знаю, что это более эффективно, чем прямой вызов -layoutSubviews, поскольку мне, возможно, потребуется сделать это дважды в методе.
И это как раз то, что мне нужно: какой-то пользовательский -setNeedsValidation для контроллера представления. Но как реализовать такую ​​функцию?

Ответы [ 2 ]

5 голосов
/ 17 октября 2011

Я не могу подтвердить, что Apple делает это именно так, но вот способ сделать то, что вы ищете, и, скорее всего, похоже на то, как реализовано setNeedsLayout. Я не проверял это (и даже не компилировал), но он должен дать представление о том, как атаковать проблему как категорию на UIViewController. Как и UIKit, это абсолютно небезопасно.

static NSMutableSet sViewControllersNeedingValidation = nil;
static BOOL sWillValidate = NO;

@implementation UIViewController (Validation)
+ (void)load {
  sViewControllersNeedingValidation = [[NSMutableSet alloc] init];
}

- (void)setNeedsValidation {
  [sViewControllersNeedingValidation addObject:self];

  if (! sWillValidate) {
    sWillValidate = YES;
    // Schedule for the next event loop
    [[self class] performSelector:@selector(dispatchValidation) withObject:nil afterDelay:0];
  }
}

+ (void)dispatchValidation {
  sWillValidate = NO;
  // The copy here is in case any of the validations call setNeedsValidation.
  NSSet *controllers = [sViewControllersNeedingValidation copy];
  [sViewControllersNeedingValidation removeAllObjects];
  [controllers makeObjectsPerformSelector:@selector(validate)];
  [controllers release];
}

- (void)validate {
  // Empty default implementation
}
1 голос
/ 17 октября 2011

Просто мысли вслух ... В документации сказано, что -setNeedsLayout планирует обновление макета на следующий "цикл обновления" (или "обновление чертежа", как упомянуто в -layoutSubviews документах).

Итак -setNeedsLayout наиболее вероятно устанавливает флаг BOOL.Флаг проверяется позже (в -drawRect:?), И если он установлен на YES, вызывается -layoutSubviews.Затем флаг сбрасывается и ждет следующих звонков на -setNeedsLayout.

...