我基本上有一个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;
}
}
还有另一种方法可以实现这个目标吗?
答案 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.你只是委托人过于复杂。为什么要为不改变的东西调用委托方法?