1

我有一个从 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 方法中的属性为零。

4

2 回答 2

2

更新:您的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];
于 2013-01-02T16:55:02.183 回答
0

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

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

于 2013-01-02T16:32:09.960 回答