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 回答