【发布时间】:2019-10-18 10:20:09
【问题描述】:
我有一个继承自 UIView 的自定义类
@interface StatusBarView : UIView
@property (weak, nonatomic) id <ActivationStatusDelegate> delegate;
//MARK: init
- (id) initWithCustom: (struct WidgetCustom *) widget;
- (id) initWithStatus:(ActivationBtnStatus) activeStatus;
//MARK: Function
- (void) setStatus: (ActivationBtnStatus) status;
@end
这是实现的一部分
@interface StatusBarView ()
@property (strong, nonatomic) IBOutlet UIButton *button1;
@property (strong, nonatomic) IBOutlet UIButton *button2;
- (void) createDefaultWidget;
@end
@implementation StatusBarView
ActivationBtnStatus status = noStatus;
struct WidgetCustom widget;
bool isWidgetSet = false;
- (void)awakeFromNib {
[super awakeFromNib];
if (!isWidgetSet) {
[self createDefaultWidget];
}
[self createButton];
}
- (instancetype)initWithCoder:(NSCoder *)coder
{
self = [super initWithCoder:coder];
if (self) {
[self createDefaultWidget];
[self createButton];
}
return self;
}
- (void)layoutSubviews {
CAShapeLayer * maskLayer1 = [CAShapeLayer layer];
maskLayer1.path = [UIBezierPath bezierPathWithRoundedRect: self.bounds byRoundingCorners: UIRectCornerBottomRight | UIRectCornerTopRight cornerRadii: (CGSize){10.0, 10.}].CGPath;
CAShapeLayer * maskLayer2 = [CAShapeLayer layer];
maskLayer2.path = [UIBezierPath bezierPathWithRoundedRect: self.bounds byRoundingCorners: UIRectCornerBottomLeft | UIRectCornerTopLeft cornerRadii: (CGSize){10.0, 10.}].CGPath;
_button1.layer.mask = maskLayer1;
_button2.layer.mask = maskLayer2;
}
- (id)initWithCustom:(struct WidgetCustom *) widget {
self = [[[NSBundle mainBundle] loadNibNamed:@"ActivationStatus" owner:nil options:nil] lastObject];
if (self) {
isWidgetSet = true;
widget = widget;
}
return self;
}
- (id)initWithStatus:(ActivationBtnStatus)activeStatus {
self = [[[NSBundle mainBundle] loadNibNamed:@"ActivationStatus" owner:nil options:nil] lastObject];
if (self) {
status = activeStatus;
}
return self;
}
}
这就是我管理 .xib 文件的方式 文件所有者的类是空的,没有出路
插座改为连接到视图,我为 .xib 文件的视图设置 StatusBarView 类,如下所示
现在在不同的 ViewController 中,我想将此类用作像这样的 IBOutlet,而不需要任何更多的初始化:
但结果只是一个灰色的视图。 有可能做这样的事情吗?如果是,请告诉我哪里出错了?
【问题讨论】:
-
有可能,但不是你这样做的方式。不要对
self进行评价并使用owner -
@Sulthan 你能解释更多吗?我应该在哪里进行此更改?
-
@taratandel - 这看起来是一个非常好的分步教程:medium.com/@brianclouser/… ... 如果您想在 Storyboard 中布局视图时查看 xib 的按钮/内容,你还需要实现
IBDesignable -
@taratandel 简而言之,您不能从
StatusBarView的初始化程序加载类StatusBarView。相反,您通常使用self = [super init...]创建self,然后从 nib 加载 view 并将其添加为StatusBarView实例的子视图。这意味着您必须将self作为所有者传递,并且在 xib 中,容器视图的类型为UIView,所有者的类型为StatusBarView。 -
@DonMag 感谢本教程正是我所需要的。
标签: ios objective-c iphone iboutlet