【问题标题】:How to programmatically change label in UIView created in a nib file?如何以编程方式更改在 nib 文件中创建的 UIView 中的标签?
【发布时间】:2011-10-06 18:21:34
【问题描述】:

我无法以编程方式更改标签中的文本。

当我运行以下代码时,NSLog 确实显示“Setting myLabel to = 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

提前谢谢..

【问题讨论】:

    标签: cocoa-touch uiview loadnibnamed


    【解决方案1】:

    您在设置标签字符串的方法中使用了不正确的访问器名称。

    在可可中,setFoo 是分配名为foo 的实例变量的方法。这不仅仅是一个约定,许多功能领域都依赖于它,例如属性的使用、键值编码等。

    在您的代码中,您的标签称为myLabel。您设置该标签的文本的方法称为setMyLabel。这会导致在加载 nib 时无法连接您的插座,因为运行时可能首先尝试使用该方法将标签分配给您的实例变量,或者上述所有方法都没有效果,而您有只是没有连接你的插座。

    【讨论】:

    • 您对setMyLabel 方法的看法是正确的。我将方法更改为ssetMyLabel,它起作用了。谢谢!
    • 很好。使用“set”作为显式设置器以外的任何方法的前缀都是自找麻烦。当我发现自己要这样做时,我很快将其更改为其他内容,例如“分配”。当我第一次看到它时,使用“sset”看起来像是一个错字。对于稍后阅读本文的人,他们应该意识到这一点。
    【解决方案2】:

    确保您的代码中有一个标签对象,如下例所示:

        IBOutlet UILabel* aLabel;  
    

    在界面生成器中(您可能已经这样做了):将 aLabel(或您使用的任何名称)插座连接到实际标签。这可以通过控制单击并从文档窗口中的文件所有者对象拖动到视图中的标签来完成。将出现一个灰色的小窗口,其中至少有两个选项,一个是前面定义的 aLabel,另一个是视图(这是视图控制器所需的默认插座,它会有一个破折号表示它已经连接到某物)。单击 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
    

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

    希望对你有帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-01
      • 1970-01-01
      • 2012-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-15
      相关资源
      最近更新 更多