如何在 xib 中访问 UITextLabel?

Posted

技术标签:

【中文标题】如何在 xib 中访问 UITextLabel?【英文标题】:How can I access the UITextLabel in a xib? 【发布时间】:2014-03-08 14:41:05 【问题描述】:

我将自定义MyView 设置为UITableView 的背景视图:

MyView *noCellsView = [[MyView alloc] init];
[[noCellsView messageLabel] setText:@".........."];
[[self tableView] setBackgroundView:noCellsView];

显示为背景视图,但未设置messageLabel

这是为什么呢?

MyView.h

#import <UIKit/UIKit.h>

@interface MyView : UIView
@property (weak, nonatomic) IBOutlet NSObject *viewFromNib;
@property (weak, nonatomic) IBOutlet UILabel *messageLabel;
@end

MyView.m

#import "MyView.h"

@implementation MyView

- (id)initWithFrame:(CGRect)frame

    self = [super initWithFrame:frame];
    if (self) 

        UIView* xibView = [[[NSBundle mainBundle] loadNibNamed:@"MyView" owner:self options:nil] objectAtIndex:0];
        [xibView setFrame:[self bounds]];
        [self addSubview:xibView];
    
    return self;

@end

MyView.xib messageLabel 连接到@property。

【问题讨论】:

你做了一个init,但是你覆盖了initWithFrame @Larme 默认 UIView 的 -init 调用 -initWithFrame: with CGRectZero. 【参考方案1】:

也许您将您的插座连接到您笔尖中的MyView 视图,但没有连接到file owner。这样你最终得到MyView 视图和另一个MyView 作为子视图。但是插座只为孩子MyView设置。

- (id)initWithFrame:(CGRect)frame

    ...
        // see that `owner:` parameter, it's the one who you want that `file owner` thing
        // to be, so if you'll bind outlets to file owner in xib and pass self to
        // this method for owner: parameter, you'll have outlets, binded to `file owner`
        // assigned to self.
        UIView* xibView = [[[NSBundle mainBundle] loadNibNamed:@"MyView" owner:self options:nil] objectAtIndex:0]; // outlets are assigned to xibView, but not to self
    ...
    [self addSubview:xibView];
    ...

要使其工作,您可以(在 Interface Builder 中)将 outlet 绑定到 file owner 而不是 MyView 视图。但是,那将是一团糟(你有MyViewMyView 作为子视图,第一个是子视图的某种冗余代理),我建议你只创建一些其他方法或加载直接通过-loadNibNamed:owner:options:查看。

// example method
+ (instancetype)loadFromXib

    // make sure that for that case you leave outlets binded to `MyView`, not to `file owner`.
    MyView *myView = ... //load from xib
    return myView;


// ...
// later on:
MyView *noCellsView = [MyView loadFromXib]; // vs [[MyView alloc] init];
[[noCellsView messageLabel] setText:@".........."];
[[self tableView] setBackgroundView:noCellsView];

【讨论】:

感谢@Maniak_bobrii,我需要进行哪些更改才能使其正常工作? 好的答案总是受欢迎的

以上是关于如何在 xib 中访问 UITextLabel?的主要内容,如果未能解决你的问题,请参考以下文章

如何在特定单词的垂直 UIStackView 换行符中制作 UITextLabel 文本 l

如何从 XIB 文件访问 ViewController 中的 IBoutlet

ios Autolayout - 在图像上对齐文本

swift - 在UIScrollView上从xib添加UIView后如何更新约束?

使用 Swift 3.0 中的数据在 Xib 中显示 tableView

从 nsbundle 访问图像