4

Appleの仕組みを知りたいのですが-setNeedsLayout

-layoutSubviewsメソッドで2回呼び出す必要があるかもしれないので、直接呼び出すよりも効率的であることはすでに知っています。
そして、それは私がそれを必要としているものです:-setNeedsValidationビューコントローラーのためのいくつかのカスタム。
しかし、そのような機能をどのように実現するのでしょうか?

4

2 に答える 2

5

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
}
于 2011-10-17T13:29:42.317 に答える
1

大声で考えてみてください...ドキュメントには-setNeedsLayout、次の「更新サイクル」(またはドキュメントに記載されている「図面の更新」)でレイアウトの更新がスケジュールされると書かれています-layoutSubviews

したがって-setNeedsLayout、おそらくBOOLフラグを設定します。フラグは後で(-drawRect:?で)チェックされYES、に設定されている場合-layoutSubviewsはが呼び出されます。次に、フラグがクリアされ、への次の呼び出しを待機し-setNeedsLayoutます。

于 2011-10-17T13:21:06.857 に答える