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

iOS自定义视图文本标签为零,ios,objective-c,uiview,xib,Ios,Objective C,Uiview,Xib,现在,我有一个名为OTGMarkerDetailView的自定义视图类,它继承自UIView和相应的.xib。它只有两个文本标签,我已经将文本标签链接到OTGMarkerDetailView.m中的文本标签IBOutlets OTGMarkerDetailsView.h: #import <UIKit/UIKit.h> @interface OTGMarkerDetailView : UIView - (void)setLabelsWithMainAddress:(NSStrin

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

OTGMarkerDetailsView.h:

#import <UIKit/UIKit.h>

@interface OTGMarkerDetailView : UIView

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

@end

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

当您使用initWithFrame在另一个视图中创建自定义视图时,将创建自定义类的新实例。此实例与interface builder中的实例不同,因此新创建的实例的标签属性为零。要解决此问题,请在interface builder中将视图放在其父视图中,并附加连接,或者为自定义视图覆盖initWithFrame,并在其中初始化标签。

当您使用自定义类的新实例在另一个视图中创建自定义视图时是创建的。此实例与您在interface builder中的实例不相同,因此,新创建的实例的标签属性为零。为了解决此问题,请将视图放置在interface builder的父视图中,并附加连接,或者为自定义视图覆盖initWithFrame,并在其中初始化标签。

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

一,。 我在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

二,。 现在创建IBOutlet属性并处理它。在customView.m文件中

@interface FTEndorsedExpandedView : UIView

     @property (retain) IBOutlet UILabel *label;

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

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

我找到了一份工作。我已经创建了一个自定义UIView

一,。 我在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

二,。 现在创建IBOutlet属性并处理它。在customView.m文件中

@interface FTEndorsedExpandedView : UIView

     @property (retain) IBOutlet UILabel *label;

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

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

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