0

私は基本的にデリゲートプロトコルを持つ UIView のサブクラス (RRView) を持っています。RRViews はデリゲート プロトコルとデリゲートを実装するビュー コントローラーにアウトレット経由で接続されます。

デリゲートに追加情報を求めるコードは、次のように実装されています。

- (void)setDelegate:(id<RRViewDelegate>)delegate {
  if (_delegate != delegate) {
    _delegate = delegate;

    if (_delegate && [_delegate respondsToSelector:@selector(cornersForRRView:)]) {
        self.corners = [_delegate cornersForRRView:self];
    }

    if (_delegate && [_delegate respondsToSelector:@selector(cornerRadiusForRRView:)]) {
        CGFloat maxRadius = floorf(self.bounds.size.height/2);
        CGFloat radius = [_delegate cornerRadiusForRRView:self];
        self.cornerRadius = MIN(radius, maxRadius);
    }

    if (_delegate && [_delegate respondsToSelector:@selector(rotationTypeForRRView:)]) {
        self.type = [_delegate rotationTypeForRRView:self];
    }

    if (_delegate && [_delegate respondsToSelector:@selector(fontSizeForRRView:)]) {
        self.fontSize = [_delegate fontSizeForRRView:self];
        self.textFont = [UIFont fontWithName:self.textFont.fontName size:self.fontSize];
    }
  }
}

私が直面している問題は、RRView がたくさんあるので、それらを区別しようとしているのですが、コンセントがまだ接続されていないことです。

- (UIRectCorner)cornersForRRView:(RRView *)view  {
  if ([view isEqual:self.dimensionsInfoView]) {
    return UIRectCornerTopLeft | UIRectCornerTopRight;
  }
  else if ([view isEqual:self.oneHundredPercentInfoView]) {
    return UIRectCornerTopRight;
  }
  else if ([view isEqual:self.deviceApperanceInfoView]) {
    return UIRectCornerTopLeft;
  }
  else {
    return 0;
 }

}

これを達成する別の方法はありますか?

4

1 に答える 1

0

まず第一に、ここではポインター比較を安全に使用できます -view == self.dimensionsInfoViewの代わりに[view isEqual:self.dimensionsInfoView]. オブジェクトの内部状態を確認するのではなく、参照に同じオブジェクトが含まれているかどうかを確認したい。

nilまた、デリゲートが( ) であるかどうかを確認する必要はありません_delegate &&。これは Java ではありません。デリゲートでメソッドを呼び出すと、nil単に が返されNOます。

あなたの質問に対する回答はかなり単純です。

オプション 1:デリゲートを xib に設定しないでください。既に接続されているviewDidLoad場合は、コントローラーの に設定します。IBOutlets

オプション 2:でデリゲート メソッドをsetDelegate呼び出さず、他のメソッドで呼び出します[UIView layoutSubviews]

オプション 3:デリゲートからセットアップ メソッドを削除し、直接呼び出しviewDidLoadます。[self.dimensionsInfoView setFontSize:10.0f][self.dimensionsInfoView setCorners:... withRadius:...]

私は間違いなくオプション 3 を使用します。あなたはデリゲートの問題を過度に複雑にしています。変更されないものに対してデリゲート メソッドを呼び出すのはなぜですか?

于 2013-03-19T10:09:14.267 に答える