从 xib 加载子类时如何设置子类 UIView 属性的值

Posted

技术标签:

【中文标题】从 xib 加载子类时如何设置子类 UIView 属性的值【英文标题】:How to set values of subclassed UIView properties when loading subclass from a xib 【发布时间】:2017-11-28 06:23:52 【问题描述】:

我有一个名为 BannerHeaderView 的子类 UIView,并设计了我希望它在 xib 中布局的方式。我已将 xib 类设置为 BannerHeaderView。我有一个在 IB 中连接的 UILabel 和一个 UIImageView。

问题是,当我在 ViewController 中初始化 BannerHeaderView 后去设置这些子视图的值时,标签和图像视图为空。我也尝试在 init 中设置它们。

BannerHeaderView.h 的代码:

@interface BannerHeaderView : UIView
@property (strong, nonatomic) IBOutlet UIImageView *bannerImage;
@property (strong, nonatomic) IBOutlet UILabel *headerLabel;

-(void)setTitle:(NSString *)title;
-(void)setImageFile:(PFFile *)imageFile;

@end

BannerHeaderView.m 的代码:

@implementation BannerHeaderView
@synthesize headerLabel, bannerImage;

-(id)init
    self = [super init];
    if (self) 
        [self customInit];
    
    return self;


-(id)initWithFrame:(CGRect)frame
    self = [super initWithFrame:frame];
    if (self) 
        [self customInit];
    
    return self;


-(void)customInit
    UIView *contentView = [[[NSBundle mainBundle] loadNibNamed:@"BannerHeaderView"
                                   owner:self
                                 options:nil] objectAtIndex:0];
    [self addSubview:contentView];
    contentView.frame = self.bounds;


-(void)setTitle:(NSString *)title
    NSLog(@"HEADER = %@", headerLabel);
    headerLabel.text = title;

我正在 ViewController 中创建 BannerHeaderImage,如下所示:

bannerHeader = [[BannerHeaderView alloc]initWithFrame:CGRectMake(0, 0, screenWidth, bannerHeight + segmentedHeaderHeight)];
[bannerHeader setTitle:@"I AM THE NEW TITLE"];

日志告诉我 headerLabel 为空。

问题:

如何设置这些子视图的值? 我应该只以编程方式设计它的布局吗?

感谢您的宝贵时间。

附:我花了几个小时研究这个,但我找不到解决方案。我确实在 SO 上找到了类似的问题,但没有找到合适的答案来解决我的问题...

【问题讨论】:

添加'BannerHeaderView' xib 的截图。谁是您的 xib 中的文件所有者,您是否连接了文件所有者视图属性? 感谢@Bilal Ashwins 的回答帮助我解决了问题。 (我认为您可能正在考虑相同的解决方案)。 【参考方案1】:

请像这样将类 BannerHeaderView 设置为 File's Owner

【讨论】:

谢谢,问题是我没有设置文件所有者的自定义类,而且我没有连接图像视图的出口和文件所有者的连接检查器中的标签.将子视图添加到 xib 时,我只是单击并将它们拖到 BannerHeaderView 的头文件中。我不知道我必须设置自定义类,并连接文件所有者的出口,就像视图本身一样。 很高兴,它可以帮助你!

以上是关于从 xib 加载子类时如何设置子类 UIView 属性的值的主要内容,如果未能解决你的问题,请参考以下文章

从 XIB 加载自定义视图,如何使其响应自定义子类?

带有 Xib 文件的 UIView 的子类

UIView:从自定义 XIB 加载导致崩溃

无法在 XIB 中添加子类

子类 UIView 错误

从 XIB 加载时 UICollectionViewCell 导致崩溃