2012-05-25 107 views
2

我正在用頭戴圍繞使用類別對於我以前可能使用過繼承的一些事情。類別最佳做法

我現在正在做的事情更多的是一個最佳實踐問題,我不知道它應該如何實現。我在UIActivityIndicatorView上寫了一個類別,它基本上將用於將活動指示符置於任意視圖中。下面你會找到我如何做的代碼示例,我的主要問題是這是否好。如果情況確實如此糟糕,我將不勝感激。謝謝。

類別:

@interface UIActivityIndicatorView (Customizations) 
    - (UIActivityIndicatorView *) inView:(UIView *) target; 
@end 

實現:

@implementation UIActivityIndicatorView (Customizations) 

- (UIActivityIndicatorView *) inView:(UIView *) target { 
    [self startAnimating]; 
    [self setHidden:NO]; 
    self.frame = target.bounds; 
    self.backgroundColor = [UIColor colorWithRed:0.0f green:0.0f blue:0.0f alpha:0.6f]; 

    return self; 
} 
@end 

然後我會用這樣的:

[background addSubview:[loader inView:background]]; 

我猜測另一種做法是做一個初始化函數來取容器視圖,然後返回「樣式」視圖,或者不返回任何東西(void),只讓該方法做樣式。

所以我正在尋找一些指導,以瞭解如何處理這個問題。

+0

我不明白你在「製作UIActivityIndi​​catorView'的第二個副本」。 (?)否則,我只會建議傳遞'CGRect'而不是'UIView',因爲這是'target'所需的所有方法。 –

+0

是的,「第二份」只是我的一些混淆。我會編輯它,因爲任何讀這個問題的人都會感到困惑。關於發送'CGRect'而不是'UIView'我同意這是一個很好的建議,謝謝你。 – qrikko

回答

4

什麼樣的擔憂我的是,我實際上使UIActivityIndi​​catorView的第二個副本,這似乎不必要

不,你不知道。你可能會對你從類別方法中返回自己的事實感到困惑,但這只是一個指針,而不是對象本身被複制。

不過,我會實現它稍有不同:

- (void) addToSuperView:(UIView *) target { 
    [self startAnimating]; 
    [self setHidden:NO]; 
    self.frame = target.bounds; 
    self.backgroundColor = [UIColor colorWithRed:0.0f green:0.0f blue:0.0f alpha:0.6f]; 

    [target addSubview:self]; 
} 

這樣的話,就不需要進行添加,當它額外的,不必要的呼叫:

[loader addToSuperView:background]; 
+0

啊,對了,被這個困惑了。這是有道理的。我的想法是,當將其添加到其中時,它會給我一個麻煩。但再一次思考一下,我發現這不是問題,所以這個實現會很好!謝謝您的幫助。 (ps。看着它,它像**一樣清潔!) – qrikko