2011-10-06 17 views
1

我無法以編程方式更改標籤中的文本。如何以編程方式更改在nib文件中創建的UIView中的標籤?

當我運行以下代碼時,NSLog會顯示「將myLabel設置爲= Hello World!」,但屏幕上的標籤不會更改。

UIViewOverlay *overlayWindow; 
    overlayWindow = [[[NSBundle mainBundle] loadNibNamed:@"UIViewOverlay" owner:self options:nil] objectAtIndex:0]; 
    [self addSubview:overlayWindow]; 

    [overlayWindow setMyLabel:@"Hello World!"]; 

我的NIB文件中有一個300x300的窗口,一些標籤和按鈕。 有一個標籤,它連接到插座中的myLabel。 UIView顯示,只是該文本不能以編程方式更改。

UIViewOverlay.h

#import <UIKit/UIKit.h> 

@interface UIViewOverlay : UIView { 
    IBOutlet UILabel *myLabel; 
} 
- (void)setMyLabel:(NSString *) label; 

@end 

UIViewOverlay.m

#import "UIViewOverlay.h" 

@implementation UIViewOverlay 

- (void)setMyLabel:(NSString *) label { 
    myLabel.text = label;    // THIS LINE IS NOT WORKING! :-(
    NSLog(@"Setting myLabel to = %@", label); // This line is working. 
} 

@end 

在此先感謝..

回答

1

您正在使用不正確的存取器名稱來設置標籤字符串。

在可可中,setFoo是分配名爲foo的實例變量的方法。這不僅僅是一種慣例,許多功能領域取決於它,例如使用屬性,鍵值編碼等。

在您的代碼中,您的標籤被稱爲myLabel。您設置該標籤的文本的方法稱爲setMyLabel。這可能導致你的插口在加載nib時不能連接,因爲運行時可能試圖使用該方法將標籤分配給您的實例變量,或者上述所有內容都沒有影響,並且您有隻是沒有連接你的插座。

+0

你說得對'setMyLabel'方法。我將該方法更改爲'ssetMyLabel',它工作。謝謝! – AReality

+0

好抓住。使用「set」作爲除了顯式設置器之外的任何方法的前綴都會引起麻煩。當我發現自己要這樣做時,我會迅速將其改爲其他內容,如「分配」。當我第一次看到它時,使用「sset」看起來像一個錯字。對於稍後閱讀此文的人,他們應該意識到這一點。 – Jim

+0

是的..我把它改爲「打印」而不是「設置」,讀得更好.. – AReality

1

確保你有一個對象在你的標籤代碼,像這樣的例子:

IBOutlet UILabel* aLabel; 

並且在界面生成器中(您可能已經完成了此操作):將aLabel(或您使用的任何名稱)插座連接到實際標籤。這可以通過控制單擊並從文檔窗口中的文件所有者對象拖動到視圖中的標籤來完成。一個小的灰色窗口將出現至少有兩個選項,其中一個將是前面定義的aLabel,另一個將是視圖(這是viewcontrollers所需的默認插座,它會有一個破折號指示它已經連接到東西)。點擊aLabel選項來選擇它。 (老實說,沒有我的Mac在我面前,我複製了this link的大部分段落指令。)

您有一個叫做aLabel的對象,您現在可以像其他任何變量一樣對待它。如果你想改變文本值,請試試這個:

aLable.text = @"some text"; 

也許你沒有建立連接。你可以嘗試以下嗎?

#import "UIViewOverlay.h" 

@implementation UIViewOverlay 

- (void)showMyLabel:(NSString *) label { 
    NSLog(@"My current label contents (myLabel) = %@", myLabel.text); // ** changed to myLabel.text 
} 

@end 

如果您無法打印原始值,則說明您沒有連接。

我希望有幫助。

相關問題