2013-03-19 109 views
0

我基本上有一个委托协议的UIView的子类(RRView)。 RRViews通过网点连接到实现代表协议的代表的视图控制器以及代表。委托协议/ IBOutlet

,我要求额外信息的委托的代码实现这样。

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

我面对的问题是我有一堆RRViews,所以我试图区分它们,但是网点还没有连接。

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

}

有另一种方式来做到这一点?

+0

所以,问题是,在你的委托回调方法,在if语句基本上都是'如果([查看isEqual:方法无])'因为self.outletVars没有连接?如果是这样的话,那么它在连接之前运行代码(比如'init:'vs'viewDidLoad')还是其他原因? – 2013-03-19 08:08:03

+0

因为一切都是在IB完成的,所以它是一个有序的问题。我猜(对我来说这听起来很合逻辑)初始化在连接插座时走向层次结构。 – 2013-03-19 10:52:24

回答

0

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

此外,您不必检查代理是否为nil_delegate &&),这不是Java,调用方法nil委托人将只返回NO

你问题前面回答相当简单。

选项1:不要将代表设置在xib中,在IBOutlets已经连接的情况下,将其设置在控制器的viewDidLoad中。

选项2:不要调用setDelegate中的委托方法,用其他方法调用它们,例如, [UIView layoutSubviews]

选项3:从代表中删除设置方法并直接在viewDidLoad(例如, [self.dimensionsInfoView setFontSize:10.0f][self.dimensionsInfoView setCorners:... withRadius:...];

,我肯定会用选项3.去你是一个代表只是过于复杂的问题。为什么调用委托方法的东西不会改变?

+0

选项3是我之前做的。我正在寻找一种更加优雅的自定义方式,因为RRView随着时间的推移逐渐发展成为一种多功能...(你知道我的意思)有很多功能。感谢所有其他提示。我认为最好的方法是在RRView中有一个通用的设置方法,它使委托调用。这样我可以控制何时进行初始化,并且我可以坚持授权。 – 2013-03-19 11:04:00

+0

@BerndRabe有一个原因,你应该坚持选择3 - 简单。使用委托设置您的视图是......很奇怪,并没有任何好处。想象一下这样设置'UIButton',使用委托方法返回字体,文本和图像。把东西放在一个地方,而不是将它们分配到许多委托方法中。 – Sulthan 2013-03-19 11:20:32

+0

我完全同意。选项3是最不容易出错的选项之一。虽然它可能需要编写更多代码(在我的情况下,可以在其中配置anchorPoints进行旋转,形状图层边框颜色等)。由于我已经实施了两种方法,我现在已经选择了。 – 2013-03-19 12:32:04