Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/106.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 代理协议/IBOutlet_Ios_Iboutlet_Delegation - Fatal编程技术网

Ios 代理协议/IBOutlet

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

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

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

- (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:
vs
viewDidLoad
),或者其他一些原因?因为一切都是在IB中完成的,所以这是一个顺序问题。我猜(对我来说,这听起来很合乎逻辑)在连接插座时,初始化会沿着层次结构进行。选项3是我以前做的。我正在寻找一种更优雅的定制方式,随着时间的推移,RRView逐渐发展成为一款多功能。。。(你知道我的意思)有很多特征的野兽。谢谢所有其他的提示。我认为最好的方法是在RRView中有一个通用的setup方法来进行委托调用。通过这种方式,我可以控制何时应该进行初始化,并且我可以坚持委派。@BerndRabe您应该坚持选项3-简单性是有原因的。使用代理设置视图是。。。奇怪,没有任何好处。设想这样设置
ui按钮
,使用委托方法返回字体、文本和图像。把事情放在同一个地方,而不是把它们分散到许多委托方法中。我完全同意。选项3是最不容易出错的选项。虽然这是一个您可能需要编写更多代码的地方(在我的例子中,在这里可以配置旋转的锚点、形状层边界颜色等)。由于我已经实现了这两种方法,我现在有了更多的选择。