initWithCoder: Custom View - 确定正在实例化的视图控制器
initWithCoder: Custom View - Determine view controller that is being instantiated
我已经准备了一个带有相关 Xib 文件的自定义 UIView 子class。在故事板上,我放置了一个 UIView 并将其 class 设置为我的自定义子 class。在自定义视图的 initWithCoder: 方法中,我加载 xib 并初始化子视图。这很好用。
现在我想在其他地方使用相同的自定义视图,但我希望我的子视图的布局不同。我想在同一个 Xib 文件中制作第二个自定义视图布局,并根据我的哪个视图控制器包含自定义视图加载正确的布局。因为我所有的子视图和所有的逻辑都是一样的,只是布局不同,我正在寻找这样的东西:
-(id)initWithCoder:(NSCoder *)aDecoder{
if (self = [super initWithCoder:aDecoder]) {
if (self.subviews.count == 0) {
UINib *nib = [UINib nibWithNibName:NSStringFromClass([self class]) bundle:nil];
UIView *subview;
if ([/*instantiating VC isKindOfClass:viewController1.class]*/) {
subview = [[nib instantiateWithOwner:self options:nil] objectAtIndex:0];
}
else if ([/*instantiating VC isKindOfClass:viewController2.class]*/) {
subview = [[nib instantiateWithOwner:self options:nil] objectAtIndex:1];
}
subview.frame = CGRectMake(0, 0, CGRectGetWidth(self.frame), CGRectGetHeight(self.frame));
subview.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
[self addSubview: subview];
}
}
return self;
}
是否有任何方法可以访问有关实例化此自定义视图的视图控制器的信息?
是的,有一种方法,放置两个视图并将两个视图的标签设置为不同,比如故事板中的 10 和 20,它们的自定义 class 你想用你的 UIView subclass 设置。
然后在你的 UIView subclass 中这样做:
-(id)initWithCoder:(NSCoder *)aDecoder {
if (self = [super initWithCoder:aDecoder]) {
if (self.subviews.count == 0) {
UINib *nib = [UINib nibWithNibName:NSStringFromClass([self class]) bundle:nil];
UIView *subview;
if (self.tag == 10) {
subview = [[nib instantiateWithOwner:self options:nil] objectAtIndex:0];
}
else if (self.tag == 20) {
subview = [[nib instantiateWithOwner:self options:nil] objectAtIndex:1];
}
subview.frame = CGRectMake(0, 0, CGRectGetWidth(self.frame), CGRectGetHeight(self.frame));
subview.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
[self addSubview: subview];
}
}
return self; }
情节提要中的标签 10 视图将替换为您的第一个视图,情节提要中的标签 20 视图将替换为您的第二个视图。
构建,运行 并享受!!!
我已经准备了一个带有相关 Xib 文件的自定义 UIView 子class。在故事板上,我放置了一个 UIView 并将其 class 设置为我的自定义子 class。在自定义视图的 initWithCoder: 方法中,我加载 xib 并初始化子视图。这很好用。
现在我想在其他地方使用相同的自定义视图,但我希望我的子视图的布局不同。我想在同一个 Xib 文件中制作第二个自定义视图布局,并根据我的哪个视图控制器包含自定义视图加载正确的布局。因为我所有的子视图和所有的逻辑都是一样的,只是布局不同,我正在寻找这样的东西:
-(id)initWithCoder:(NSCoder *)aDecoder{
if (self = [super initWithCoder:aDecoder]) {
if (self.subviews.count == 0) {
UINib *nib = [UINib nibWithNibName:NSStringFromClass([self class]) bundle:nil];
UIView *subview;
if ([/*instantiating VC isKindOfClass:viewController1.class]*/) {
subview = [[nib instantiateWithOwner:self options:nil] objectAtIndex:0];
}
else if ([/*instantiating VC isKindOfClass:viewController2.class]*/) {
subview = [[nib instantiateWithOwner:self options:nil] objectAtIndex:1];
}
subview.frame = CGRectMake(0, 0, CGRectGetWidth(self.frame), CGRectGetHeight(self.frame));
subview.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
[self addSubview: subview];
}
}
return self;
}
是否有任何方法可以访问有关实例化此自定义视图的视图控制器的信息?
是的,有一种方法,放置两个视图并将两个视图的标签设置为不同,比如故事板中的 10 和 20,它们的自定义 class 你想用你的 UIView subclass 设置。
然后在你的 UIView subclass 中这样做:
-(id)initWithCoder:(NSCoder *)aDecoder {
if (self = [super initWithCoder:aDecoder]) {
if (self.subviews.count == 0) {
UINib *nib = [UINib nibWithNibName:NSStringFromClass([self class]) bundle:nil];
UIView *subview;
if (self.tag == 10) {
subview = [[nib instantiateWithOwner:self options:nil] objectAtIndex:0];
}
else if (self.tag == 20) {
subview = [[nib instantiateWithOwner:self options:nil] objectAtIndex:1];
}
subview.frame = CGRectMake(0, 0, CGRectGetWidth(self.frame), CGRectGetHeight(self.frame));
subview.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
[self addSubview: subview];
}
}
return self; }
情节提要中的标签 10 视图将替换为您的第一个视图,情节提要中的标签 20 视图将替换为您的第二个视图。
构建,运行 并享受!!!