委托协议/ IBOutlet
我基本上有一个委托协议的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;
}
}
有另一种方式来做到这一点?
首先,你可以放心地使用此指针比较 - 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.去你是一个代表只是过于复杂的问题。为什么调用委托方法的东西不会改变?
选项3是我之前做的。我正在寻找一种更加优雅的自定义方式,因为RRView随着时间的推移逐渐发展成为一种多功能...(你知道我的意思)有很多功能。感谢所有其他提示。我认为最好的方法是在RRView中有一个通用的设置方法,它使委托调用。这样我可以控制何时进行初始化,并且我可以坚持授权。 – 2013-03-19 11:04:00
@BerndRabe有一个原因,你应该坚持选择3 - 简单。使用委托设置您的视图是......很奇怪,并没有任何好处。想象一下这样设置'UIButton',使用委托方法返回字体,文本和图像。把东西放在一个地方,而不是将它们分配到许多委托方法中。 – Sulthan 2013-03-19 11:20:32
我完全同意。选项3是最不容易出错的选项之一。虽然它可能需要编写更多代码(在我的情况下,可以在其中配置anchorPoints进行旋转,形状图层边框颜色等)。由于我已经实施了两种方法,我现在已经选择了。 – 2013-03-19 12:32:04
所以,问题是,在你的委托回调方法,在if语句基本上都是'如果([查看isEqual:方法无])'因为self.outletVars没有连接?如果是这样的话,那么它在连接之前运行代码(比如'init:'vs'viewDidLoad')还是其他原因? – 2013-03-19 08:08:03
因为一切都是在IB完成的,所以它是一个有序的问题。我猜(对我来说这听起来很合逻辑)初始化在连接插座时走向层次结构。 – 2013-03-19 10:52:24