代表协议/ IBOutlet

时间:2013-03-19 07:44:38

标签: ios iboutlet delegation

我基本上有一个UIView的子类(RRView)和一个委托协议。 RRView通过插座连接到视图控制器,视图控制器实现委托协议以及代理。

我向代表询问其他信息的代码是这样实现的。

- (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;
 }

}

还有另一种方法可以实现这个目标吗?

1 个答案:

答案 0 :(得分:0)

首先,您可以安全地使用指针比较 - view == self.dimensionsInfoView而不是[view isEqual:self.dimensionsInfoView]。您想检查引用是否包含相同的对象,而不是检查对象的内部状态。

此外,您不必检查委托是否为nil_delegate &&),这不是Java,在nil委托上调用方法只会返回{{1} }。

你问的问题很简单。

选项1:不要在xib中设置委托,在NO已连接时将其设置在控制器的viewDidLoad中。

选项2:请勿在{{1​​}}中调用委托方法,请使用其他方法调用它们,例如IBOutlets

选项3:从代理中删除设置方法,然后直接在setDelegate中调用它们,例如[UIView layoutSubviews]viewDidLoad;

我肯定会使用选项3.你只是委托人过于复杂。为什么要为不改变的东西调用委托方法?

相关问题