2011-06-29 84 views
0

所以我對將一個NSString傳遞給一個類感到困惑。我有一個傳說類,繪製一個小盒子,並在盒子上有一個標籤。我的盒子本質上是一個UIView對象,我改變背景顏色。在我的init方法中,我初始化了這個盒子,然後從我創建這個類的一個實例的其他類中,設置了背景顏色。但是,在NSString的情況下,我不知道如何分配/ init,並設置其他類的文本。這是我的傳奇代碼。在類之間傳遞一個NSString

- (id)sharedInit { 
    self.backgroundColor = [UIColor clearColor]; 

    self.LegendBox = [[UIView alloc] initWithFrame:CGRectMake(0, self.frame.size.height/2 - LEGEND_SIZE/2, LEGEND_SIZE, LEGEND_SIZE)]; // hugs LHS, centered vertically 

    self.LegendLabel = [[NSString alloc] init]; 

    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(25, 0, self.bounds.size.width - 25, self.bounds.size.height)]; 
    label.textColor = [UIColor whiteColor]; 
    label.backgroundColor = [UIColor clearColor]; 
    label.text = self.LegendLabel; 
    label.font = [UIFont fontWithName:@"Arial" size:14.0]; 
    label.numberOfLines = 5; 
    label.lineBreakMode = UILineBreakModeWordWrap; 

    [self addSubview:label]; 
    [self addSubview:_legendBox]; 

    return self; 
} 

後來,當我嘗試在我的其他類創建的傳說類的一個實例:

PieChartLabelView *labelView1 = [[PieChartLabelView alloc] initWithFrame:CGRectMake(0, 0, 140, 80)]; 
labelView1.LegendBox.backgroundColor = BLUE_COLOR; 
NSString *str1 = [[NSString alloc] initWithFormat:@"as;flkasjdf;laksjdf"]; 
labelView1.LegendLabel = str1; 

[self addSubview:labelView1]; 
[str1 release]; 
[labelView1 release]; 

我沒有得到我的標籤的任何文本。

第二個問題,我在試圖更好地瞭解自我/高德/ setter方法/干將,是我的傳說級,爲什麼我只是用

[self addSubview:_legendLabel]; 

與self.LegendLabel?我仍然不完全明白。謝謝。

回答

1

第二類似牛逼

先回答你的第二個問題,無論是做

[self addSubview:_legendLabel]; 

[self addSubview:self.legendLabel]; 

應該是相同的,如果你沒有做任何延遲實例。大多數時候,getter方法會檢索值,所以您應該很好地採用第一種方法。但是,如果你定義自己的getter方法,你做這樣的事情,做任何延遲實例

- (UILabel *)legendLabel { 
    if (!_legendLabel) { 
     // Instantiate _legendLabel 
    } 

    return _legendLabel; 
} 

那麼就會有不同的含義,如果你不這樣做self.legendLabel

第一部分

這是你的第二個問題增加了一些混亂,你似乎是指LegendLabelNSString變量,而你試圖將其添加爲你的第二個問題,一個子視圖。

但是,你似乎在期待這一點 -

label.text = self.LegendLabel; 

這不會影響標籤文本兩個 -

labelView1.LegendLabel = str1; 

,因爲這樣做在sharedInit方法來改變標籤文本原因,

  1. 如果標籤的text屬性和LegendLabel都指向sa我的對象,那麼你需要該對象是可變的,以便更改反映在標籤上。如果你重新分配LegendLabel,那麼他們都會指向兩個不同的對象。
  2. 大多數時候NSString屬性被聲明爲copy屬性來防止可變性。所以即使LegendLabel可變,您也無法更改標籤的文字。

因此,這意味着你將不得不使標籤的實例變量或屬性,這樣就可以直接訪問標籤和更新它的text財產或改寫LegendLabel的setter方法來更新標籤。

但是我認爲將標籤聲明爲屬性是需要採取的方法,並且LegendLabel的命名有點混亂。如果它是一個標籤,它會更好。

0

當您創建的NSString你應該直接做這樣的:

NSString *str1 = @"ñalskdfjsdañlkfj"; 

如果你想使用的格式,你做這樣的:

NSString *str2 = [NSString stringWithFormat:@"This is string %d", 2]; 

如果你想使用它作爲一個類的屬性,你應該聲明它是這樣的:

@property (copy) NSString *str3;