2011-10-06 16 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 

如果您无法打印原始值,则说明您没有连接。

我希望有帮助。

相关问题