iOS 自定义视图文本标签为零

Posted

技术标签:

【中文标题】iOS 自定义视图文本标签为零【英文标题】:iOS Custom View Text Labels Are Nil 【发布时间】:2014-07-20 22:31:34 【问题描述】:

现在我有一个名为 OTGMarkerDetailView 的自定义视图类,它继承自 UIView 和相应的 .xib。它只有两个文本标签,我已将文本标签链接到 OTGMarkerDetailView.m 中的文本标签 IBOutlets。

OTGMarkerDetailsView.h:

#import <UIKit/UIKit.h>

@interface OTGMarkerDetailView : UIView

- (void)setLabelsWithMainAddress:(NSString *)mainAddress subAddress:(NSString *)subAddress;

@end

OTGMarkerDetailView.m

#import "OTGMarkerDetailView.h"

@interface OTGMarkerDetailView ()

@property (nonatomic, strong) IBOutlet UILabel *mainAddressLabel;
@property (nonatomic, strong) IBOutlet UILabel *subAddressLabel;

@end

@implementation OTGMarkerDetailView

- (void)setLabelsWithMainAddress:(NSString *)mainAddress subAddress:(NSString *)subAddress 
    NSLog(@"%@", self.mainAddressLabel.text);
    self.mainAddressLabel.text = mainAddress;
    self.subAddressLabel.text = subAddress;
    NSLog(@"%@", self.mainAddressLabel.text);


@end

我使用 initWithFrame 将它作为子视图加载到另一个视图中。但是当我尝试设置文本标签值时,控制台总是记录 null,当我使用断点时,似乎 mainAddressLabel 和 subAddressLabel 本身是 nil 。我在将 xib 链接到视图时做错了什么吗?我错过了什么?谢谢。

【问题讨论】:

【参考方案1】:

我找到了解决办法。我创建了一个自定义 UIView。

1。 我在 initWithFrame 方法中将 Nib 文件附加到它

CustomView *nibView;

- (id)initWithFrame:(CGRect)frame

    self = [super initWithFrame:frame];
    if (self) 
        NSArray *array = [[NSBundle mainBundle] loadNibNamed:@"CustomView" owner:self options:nil];
        nibView = [array objectAtIndex:0];
        [self addSubview:nibView];

    
    return self;

你可以看得很清楚,我没有创建 UIView 的实例,而是创建了相同类类型的 nibView。

2。 现在创建 IBOutlet 属性并对其进行处理。在 customView.m 文件中。

@interface FTEndorsedExpandedView : UIView

     @property (retain) IBOutlet UILabel *label;

@end

3。 创建函数来设置标题或更改属性。 (在 customView.m 文件中)。使用 nibView 来访问属性,而不是使用 self.label

-(void)setLabelText:(NSString*)string
    [nibView.label setText:string];

【讨论】:

【参考方案2】:

当您使用 initWithFrame 在另一个视图中创建自定义视图时,会创建自定义类的新实例。此实例与您在界面生成器中的实例不同,因此此新创建的实例的标签属性为零。为了解决这个问题,要么将您的视图放在其附加连接的界面构建器中的父视图中,要么为您的自定义视图覆盖 initWithFrame 并在那里初始化您的标签。

【讨论】:

所以我必须在界面构建器中为我试图添加它的视图添加这个视图?否则,我将不得不手动实例化每个 IBOutlet? 是的,这是选项之一。否则,只需为您的自定义视图覆盖 initWithFrame 并在那里初始化您的标签。 如何利用我在 xib 文件中放置的标签?是否可以不以编程方式创建和放置标签? 为了使用界面生成器来连接你的标签。您必须将子视图放在界面构建器的父视图中。因此,现在您的父视图将拥有您的子视图,因为它是在加载 nib 文件时设置其标签的子视图。 这似乎不起作用,父视图中没有显示任何内容。我想我必须做类似 loadWithNib 的事情,这可能吗?

以上是关于iOS 自定义视图文本标签为零的主要内容,如果未能解决你的问题,请参考以下文章

Xamarin iOS 自定义视图

IBOutlet 在 IBDesignable 类中为零

如何从表格视图的自定义单元格内的文本字段中获取值(标签)以发布到 URL [重复]

修复表格视图单元格中的文本,ios?

在使用视图 iOS 滚动 uilabel 时保持标签文本与屏幕中心对齐?

如何固定表格视图中自定义单元格文本字段的标签值?