【问题标题】:iOS Custom View Text Labels Are NiliOS 自定义视图文本标签为零
【发布时间】: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 链接到视图时做错了什么吗?我错过了什么?谢谢。

【问题讨论】:

    标签: ios objective-c uiview 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 的事情,这可能吗?
      猜你喜欢
      • 2018-12-06
      • 1970-01-01
      • 2017-03-14
      • 1970-01-01
      • 1970-01-01
      • 2012-12-18
      • 1970-01-01
      • 1970-01-01
      • 2012-05-07
      相关资源
      最近更新 更多