Ios 代理协议/IBOutlet
我基本上有一个UIView的子类(RRView)和一个委托协议。RRViews通过插座连接到视图控制器,该控制器实现代理协议以及代理 我向代表询问其他信息的代码是这样实现的Ios 代理协议/IBOutlet,ios,iboutlet,delegation,Ios,Iboutlet,Delegation,我基本上有一个UIView的子类(RRView)和一个委托协议。RRViews通过插座连接到视图控制器,该控制器实现代理协议以及代理 我向代表询问其他信息的代码是这样实现的 - (void)setDelegate:(id<RRViewDelegate>)delegate { if (_delegate != delegate) { _delegate = delegate; if (_delegate && [_delegate responds
- (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];
}
}
}
}
有没有其他方法可以实现这一点?首先,您可以在这里安全地使用指针比较-
视图==self.dimensionsInfoView
而不是[view isEqual:self.dimensionsInfoView]
。您希望检查引用是否包含相同的对象,而不是检查对象的内部状态
另外,您不必检查委托是否为nil
(\u delegate&
),这不是Java,在nil
委托上调用方法只会返回NO
这个问题的答案很简单
选项1:不要在xib中设置代理,而是在控制器的viewdiload
中设置代理,此时IBOutlets
已连接
- (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;
}
选项2:不要在setDelegate
中调用委托方法,而是在其他方法中调用它们,例如[UIView layoutSubviews]
选项3:从代理中删除设置方法,并在viewDidLoad
中直接调用它们,例如[self.dimensionsInfoView setFontSize:10.0f]
,[self.dimensionsInfoView setCorners:…withRadius:…]
我肯定会选择第三种方案。你只是把事情和一个代表搞得太复杂了。为什么要为不变的对象调用委托方法?问题是,在委托回调方法中,if语句基本上都是
if([view isEqual:nil])
,因为self.outletVars没有连接?如果是这样的话,那就是在连接之前运行代码的问题(比如在init:
vsviewDidLoad
),或者其他一些原因?因为一切都是在IB中完成的,所以这是一个顺序问题。我猜(对我来说,这听起来很合乎逻辑)在连接插座时,初始化会沿着层次结构进行。选项3是我以前做的。我正在寻找一种更优雅的定制方式,随着时间的推移,RRView逐渐发展成为一款多功能。。。(你知道我的意思)有很多特征的野兽。谢谢所有其他的提示。我认为最好的方法是在RRView中有一个通用的setup方法来进行委托调用。通过这种方式,我可以控制何时应该进行初始化,并且我可以坚持委派。@BerndRabe您应该坚持选项3-简单性是有原因的。使用代理设置视图是。。。奇怪,没有任何好处。设想这样设置ui按钮
,使用委托方法返回字体、文本和图像。把事情放在同一个地方,而不是把它们分散到许多委托方法中。我完全同意。选项3是最不容易出错的选项。虽然这是一个您可能需要编写更多代码的地方(在我的例子中,在这里可以配置旋转的锚点、形状层边界颜色等)。由于我已经实现了这两种方法,我现在有了更多的选择。