0

何度も自問自答した質問があります。以下の例を見てみましょう:

 if (animated) {
    [UIView animateWithDuration:0.3 animations:^{            
        view.frame = newFrame;
    } completion:^(BOOL finished) {

        // same code as below
        SEL selector = @selector(sidePanelWillStartMoving:);
        if ([currentPanningVC conformsToProtocol:@protocol(CHSurroundedViewDelegate)] &&
            [currentPanningVC respondsToSelector:selector]) {
            [(id)self.currentPanningVC sidePanelWillStartMoving:self.currentPanningVC];
        }

        if ([centerVC conformsToProtocol:@protocol(CHSurroundedViewDelegate)] &&
            [centerVC respondsToSelector:selector]) {
            [(id)centerVC sidePanelWillStartMoving:self.currentPanningVC];
        }
    }];
}
else {
    view.frame = newFrame;

    // same code as before
    SEL selector = @selector(sidePanelWillStartMoving:);
    if ([currentPanningVC conformsToProtocol:@protocol(CHSurroundedViewDelegate)] &&
        [currentPanningVC respondsToSelector:selector]) {
        [(id)self.currentPanningVC sidePanelWillStartMoving:self.currentPanningVC];
    }

    if ([centerVC conformsToProtocol:@protocol(CHSurroundedViewDelegate)] &&
        [centerVC respondsToSelector:selector]) {
        [(id)centerVC sidePanelWillStartMoving:self.currentPanningVC];
    }
}

完了ブロックとアニメーション化されていないコードブロックのコードは同じです。そして、これはしばしばこのようなものです。つまり、1つがアニメーション化されていることを除いて、両方の結果は同じです。

これは、まったく同じコードの2つのブロックを持っていることを本当に気にしますが、どうすればそれを回避できますか?

ありがとう!

4

2 に答える 2

7

アニメーションと完了コードのブロック変数を作成し、アニメーション化されていない場合はそれらを自分で呼び出します。例えば:

void (^animatableCode)(void) = ^{
    view.frame = newFrame;
};

void (^completionBlock)(BOOL finished) = ^{
    // ...
};

if (animated) {
    [UIView animateWithDuration:0.3f animations:animatableCode completion:completionBlock];

} else {
    animatableCode();
    completionBlock(YES);
}
于 2012-05-07T12:57:14.307 に答える
4

ブロックオブジェクトを作成し、両方の場所で使用してください!.

void (^yourBlock)(BOOL finished);

yourBlock = ^{

        // same code as below
        SEL selector = @selector(sidePanelWillStartMoving:);
        if ([currentPanningVC conformsToProtocol:@protocol(CHSurroundedViewDelegate)] &&
            [currentPanningVC respondsToSelector:selector]) {
            [(id)self.currentPanningVC sidePanelWillStartMoving:self.currentPanningVC];
        }

        if ([centerVC conformsToProtocol:@protocol(CHSurroundedViewDelegate)] &&
            [centerVC respondsToSelector:selector]) {
            [(id)centerVC sidePanelWillStartMoving:self.currentPanningVC];
        }
    }

あなたのコードでは、

    if (animated) {
    [UIView animateWithDuration:0.3 animations:^{            
        view.frame = newFrame;
    } completion:yourBlock];
}
else {
yourBlock();
}
于 2012-05-07T12:54:49.673 に答える