Objective C - 从视图控制器设置 UIView 子类的标签属性

Posted

技术标签:

【中文标题】Objective C - 从视图控制器设置 UIView 子类的标签属性【英文标题】:Objective C - Set Label Properties on UIView Subclass from View Controller 【发布时间】:2017-07-23 04:35:19 【问题描述】:

在我的应用程序中,我有一个在 Nib 文件中设计的自定义 Google 地图图钉标记。部分大头针会显示预计到达时间。

这是我加载 Nib 并尝试设置自定义时间的方式:

self.markerPinFromNib = [[[NSBundle mainBundle] loadNibNamed:@"PinWithTimeView" owner:self options:nil] firstObject];
self.markerPinFromNib.estTime.text = @"20";

当我运行这个时,我得到一个错误:

-[UIView estTime]: unrecognized selector sent to instance

PinWithTimeView.h

#import <UIKit/UIKit.h>
@interface PinWithTimeView : UIView

@property (nonatomic, weak) IBOutlet UIImageView *rotateCircle;
@property (nonatomic, strong) IBOutlet UILabel *estTime;

@end

谁能指出我做错了什么?

【问题讨论】:

【参考方案1】:

在您的 PinWithTimeView.h 中

@interface PinWithTimeView : UIView

@property (nonatomic, weak) IBOutlet UIImageView *rotateCircle;
@property (nonatomic, weak) IBOutlet UILabel *estTime;
-(id)initWithEstTime:(NSString*)time;
@end

在您的 PinWithTimeView.m 中

-(id)initWithEstTime:(NSString*)time
    self = [super init];
    if (self) 
        self = [[[NSBundle mainBundle] loadNibNamed:@"PinWithTimeView" owner:self options:nil] objectAtIndex:0];
        self.estTime.text = time;

    
    return self;

在你的控制器中

self.markerPinFromNib = [[PinWithTimeView alloc]initWithEstTime:@"20"];

【讨论】:

仍然收到“[UIView estTime]: unrecognized selector sent to instance”...知道为什么吗? 您能否分享一下代码崩溃的行。请使用断点进行调试【参考方案2】:

您应该将实例从 nib 转换为有效的PinWithTimeView。像这样:

((PinWithTimeView *)self.markerPinFromNib).estTime.text = @"20";

因为loadNibNamed:owner:options: 将返回一个包含UIView 实例的数组。

【讨论】:

以上是关于Objective C - 从视图控制器设置 UIView 子类的标签属性的主要内容,如果未能解决你的问题,请参考以下文章

Objective C:从视图控制器访问变量到 NSObject

是否可以使用情节提要从 swift 类中调用 Objective c 视图控制器类?

从 xib 文件移动到 Objective C 中的视图控制器

可以将静态类设置为 UItextfield (Objective C) 的委托吗?

在Objective c中两行文本的末尾添加一个链接/ UI按钮

Objective-C UI之UITableView详解