【问题标题】:Setting text for IBOutlet labels in a custom UIView在自定义 UIView 中为 IBOutlet 标签设置文本
【发布时间】:2013-01-03 01:32:12
【问题描述】:

我有一个从 xib 文件加载的自定义 UIView (MyView) 对象。在 MyView.m 中,我有一个在 initWithCoder 中调用的方法,它会进行一些初始化。这在大多数情况下都有效,但我试图在此处设置一些 IBOutlet 标签属性中的文本,但它不起作用,我意识到因为此时属性尚未初始化。

我尝试在 drawRect 方法中设置网点的文本,它确实有效。但我想我读到如果你不需要实现 drawRect 会导致一些性能下降。我的问题是,在哪里设置 IBOutlet 标签属性的文本的最佳位置? (我实际上正在做的是将其设置为 xib 中的本地化版本。我知道本地化的 xib 文件,但我想在代码中设置文本。)


这是一些代码。以下是我在视图控制器中初始化视图的方式:

NSArray *nibContents = [[NSBundle mainBundle] loadNibNamed:@"MyView"
                                                     owner:self
                                                   options:nil];
_myView = [nibContents objectAtIndex:0];

这是 MyView.m 中的 initWithCoder 方法

- (id)initWithCoder:(NSCoder *)coder
{
    self = [super initWithCoder:coder];
    if (self) {
        [self localizeLabels];
    }
    return self;
}

这里是 localizeLabels 方法:

- (void)localizeLabels
{
    self.powerPlant.text = NSLocalizedString(@"POWERPLANTBREAKDOWN_HEADERCOLUMN1", nil);
    self.output.text = NSLocalizedString(@"POWERPLANTBREAKDOWN_HEADERCOLUMN2", nil);
    self.capacity.text = NSLocalizedString(@"POWERPLANTBREAKDOWN_HEADERCOLUMN3", nil);
}

我检查了这些方法确实是使用断点调用的,并且 localizeLabels 方法中的属性为零。

【问题讨论】:

    标签: ios uiview


    【解决方案1】:

    更新: 您的MyView.m 课程一开始应该是这样的。

    - (id)initWithFrame:(CGRect)frame
    {
        self = [super initWithFrame:frame];
        if (self) {
            // Initialization code
            NSArray *nibContents = [[NSBundle mainBundle] loadNibNamed:@"MyView"
                                                             owner:self
                                                           options:nil];
            UIView *_myView = [nibContents objectAtIndex:0];
            [self addSubview: _myView];
            [self localizeLabels];
        }
        return self;
    }
    
    - (id)initWithCoder:(NSCoder *)aDecoder {
        self = [super initWithCoder:aDecoder];
        if (self) {
            // Initialization code
            [self localizeLabels];
        }
        return self;
    }
    

    在您的viewcontroller 中。你需要像这样initialize你的MyView

    MyView _view = [[MyView alloc]initWithFrame:CGRectMake(0, 0, 100, 100)];
    [self.view addSubview:_view];
    

    【讨论】:

    • 这似乎给了我一个无限循环,因为加载 nib 调用 initWithCoder。
    • 还没有开始工作,而且我太忙了,没有时间回去。不用担心,这个周末我会看看,谢谢!
    【解决方案2】:

    如果您的 IBOutlet 属性在 Interface Builder 中正确连接到 xib,则它们会被初始化。。初始化发生在 xib 加载到应用程序中时。毕竟,这些属性只是对 xib 实例化对象的弱引用。

    所以我最好的猜测是您没有将 IBOutlets 连接到它们各自的 xib 对象 - 检查 Interface Builder。

    【讨论】:

    • 我知道它们连接正确,因为当我在 drawRect 中设置它们时它们确实被设置了。但它们并没有在 initWithCoder 方法中为我初始化。
    • @Darren 你能发布你如何在 initWithCoder: 方法中初始化值吗?你能发布那个方法吗?检查你是否调用了 initwithcoder: 方法的超类实现
    猜你喜欢
    • 1970-01-01
    • 2012-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-23
    • 2021-12-09
    • 2013-06-07
    相关资源
    最近更新 更多