2013-03-19 195 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