2011-03-19 74 views
0

所以我在我的代碼是這樣的:更簡潔的方法在目標C中做到這一點?

leftMostLabel = [[UILabel alloc] initWithFrame:CGRectMake(60.0f, 2.0f, 80.0f, 40.0f)]; 
    leftMostLabel.text = @"Some text"; 
    leftMostLabel.textColor = [UIColor colorWithWhite:1.0 alpha:1.0]; 
    leftMostLabel.backgroundColor = [UIColor clearColor]; 
    leftMostLabel.textAlignment = UITextAlignmentCenter; 
    leftMostLabel.font = [UIFont boldSystemFontOfSize:13.0]; 
    leftMostLabel.userInteractionEnabled = NO; 

    centerLeftLabel = [[UILabel alloc] initWithFrame:CGRectMake(115.0f, 2.0f, 80.0f, 40.0f)]; 
    centerLeftLabel.text = currentDate; 
    centerLeftLabel.textColor = [UIColor colorWithWhite:1.0 alpha:1.0]; 
    centerLeftLabel.backgroundColor = [UIColor clearColor]; 
    centerLeftLabel.textAlignment = UITextAlignmentCenter; 
    centerLeftLabel.font = [UIFont systemFontOfSize:12.0]; 
    centerLeftLabel.userInteractionEnabled = NO; 

這是工作的罰款和花花公子,但我再說一遍,格式很多很多次。我會非常喜歡在變量(leftMostLabel,centerLeftLabel等)傳遞給這對我產生了標籤的功能基礎上,名稱的變量的,我傳遞給它,以及兩者的其他參數幕後我餵它。這可能嗎?如果是這樣,我該怎麼辦呢?

提前致謝!

回答

1

我會把它分解成一個函數來設置我的值。

leftMostLabel = [[UILabel alloc] initWithFrame:CGRectMake(60.0f, 2.0f, 80.0f, 40.0f)]; 
leftMostLabel.text = @"Some text"; 
[self initLabelValues:leftMostLabel withFont:[UIFont boldSystemFontOfSize:13.0]]; 

centerLeftLabel = [[UILabel alloc] initWithFrame:CGRectMake(115.0f, 2.0f, 80.0f, 40.0f)]; 
centerLeftLabel.text = currentDate; 
[self initLabelValues:centerLeftLabel withFont:[UIFont boldSystemFontOfSize:12.0]]; 

-(void) initLabelValues:(UILabel*)inLabel withFont:(UIFont*)font { 

    [inLabel setTextColor:[UIColor colorWithWhite:1.0 alpha:1.0]]; 
    [inLabel setBackgroundColor:[UIColor clearColor]]; 
    [inLabel setTextAlignment:UITextAlignmentCenter]; 
    [inLabel setUserInteractionEnabled:NO]; 

    [inLabel setFont:font]; 
} 
+1

避免命名方法 - 初始化,除非它們是初始化方法。一個UILabel的-init ...方法應該調用指定的初始化程序-initWithFrame :. – Caleb 2011-03-19 12:35:10

+0

我同意,setLabelValues可能是一個更好的選擇。所以你從我那裏得到了+1。 – Konrad77 2011-03-19 13:05:30

+0

'setLabelValues'將是一個同樣不好的名字,因爲它意味着該方法設置了一個實例變量。順便說一下,你發佈的例子是一個方法,而不是一個函數,但我認爲一個函數會更合適,因爲你的實現不會觸及對象的實例變量。 – jlehr 2011-03-20 03:07:19

3

的Objective-C提供了可能通過類來擴展現有的類,所以你可以很容易地添加一個方法,以這樣的UILabel:+labelWithFrame:text:textColor:backgroundColor:alignment:font:interaction:。這會縮短事情有點,所以你的代碼看起來像:

UILabel *leftLabel = [UILabel labelWithFrame:CGRectMake(...) 
             text:@"Yoo hoo!" 
            textColor:[UIColor blueColor] 
          backgroundColor:[UIColor clearColor] 
           textAlignment:UITextAlignmentLeft 
             font:[UIFont systemFontOfSize:12]; 
         userInteractionEnabled:NO]; 

這是少了幾分凌亂的目光,也許是值得的。

如果你的大多數標籤是相似的,另一種選擇是添加創建使用原型標籤的方法。 UIView沒有實現NSCopying,所以你不能僅僅使用-copy方法創建一個標籤的副本,但是你可以編寫一個方法來創建一個新的標籤並根據現有的標籤進行配置。調用它可能看起來像:

UILabel *centerLabel = [UILabel labelWithFrame:CGRectMake(...) 
            likeLabel:leftLabel]; 
centerLabel.text = @"Hey there!"; 

最後,考慮使用Interface Builder來創建所有這些標籤。 Cocoa和Cocoa Touch代碼會充滿呼叫來查看配置方法,如-initWithFrame:和-addSubview:如果它不適合IB。它可能會也可能不適合您的情況,但有時候人們會避免IB,因爲他們認爲它更多工作或使代碼更難以管理;我認爲情況正好相反。

+0

我實際上是從我的應用程序的工具欄中相當頻繁地刪除和添加標籤,我認爲在代碼中做它肯定更容易。我有IB中製作的按鈕,但是它們很難通過代碼進行操作,因此我儘可能地儘量避免IB。 – Stunner 2011-03-19 21:35:13

+1

在IB中創建的對象與在代碼中創建的對象沒有區別,因此它們不可能更難以操縱 - 它們是同一件事。如果你不懂如何使用IB,'在代碼中做'只是'更容易'。不過,公平地說,IB一開始就很神祕。我的建議是:幫你一個忙,強迫自己學習IB - 你不會後悔的! – jlehr 2011-03-20 03:17:11

2

簡明扼要,有一個詞你並沒有經常與Objective-C一起看到。來自另一種語言,我覺得你的痛苦與這些片段。

我已經使出了一次寫入必要的標籤變化,然後在重複了很多次。其他發佈的答案都是可行的選項,但我不太清楚簡明的論點。 @ Caleb的'likeLabel'答案是最通用的,但你仍然需要能夠引用其他標籤。

我做出的UILabel項目特定的類別,並把各種標籤在那裏我自己。我很喜歡爲每個標籤重複的唯一事情就是框架和文本。將+方法放在一個類別中並不是真的需要,但UILabel確實總結了你想要的東西。在分類完成之後,您將如何使用它:

UILabel *someLabel = [UILabel headerLabelWithFrame:CGRectMake(10, 10, 256, 32) andText:@"Conciseness"]; 

這就是類別只有一種標籤類型的樣子。如果需要,您可以添加更多:

@interface UILabel (ProjectSpecificLabels) 
+(UILabel *)headerLabelWithFrame:(CGRect)frame andText:(NSString *)text; 
@end 

@implementation UILabel (ProjectSpecificLabels) 
+(UILabel *)headerLabelWithFrame:(CGRect)frame andText:(NSString *)text { 
    UILabel *label = [[[self alloc] initWithFrame:frame] autorelease]; 
    label.text = text; 
    label.textColor = [UIColor colorWithWhite:1.0 alpha:1.0]; 
    label.backgroundColor = [UIColor clearColor]; 
    label.textAlignment = UITextAlignmentCenter; 
    label.font = [UIFont boldSystemFontOfSize:13.0]; 
    label.userInteractionEnabled = NO; 
    return label; 
} 
@end 

希望它有幫助。
乾杯, EP。

+0

對於優雅(簡潔)的解決方案來說,+1,但是您可能想考慮在類方法中調用'[self alloc]',而不是''[ alloc]'。這將允許繼承的方法爲子類正確工作。 – jlehr 2011-03-20 03:10:33

+0

好的!在那裏添加它,謝謝@jlehr – epologee 2011-03-21 11:16:58

相關問題