我创建了一个自定义类" CustomSCNView"继承自SCNView。我想在另一个视图控制器中使用自定义类。所以我需要创建一个CustomSCNView对象并将其用于另一个类来操作。但是如何在另一个类中创建CustomSCNView对象。 这不起作用:
CustomSCNView *customView = [[CustomSCNView alloc]init]; //in viewcontroller.m
很抱歉忘了提到我使用界面构建器将SCNView拖动到视图控制器,然后将其类设置为CustomSCNView。
答案 0 :(得分:1)
我对您的问题感到有些困惑,但我已经在https://github.com/NSGod/CustomSCNView创建了一个示例项目,可能会执行您正在寻找的内容。
首先,故事板在CustomSCNView
视图中并排排列了2 ViewController
个。像你一样,我将2 SCNView
从IB调色板拖到视图中,然后将自定义类设置为CustomSCNView
。
其次,CustomSCNView
类定义如下:
#import <Cocoa/Cocoa.h>
#import <SceneKit/SceneKit.h>
@interface CustomSCNView : SCNView
@property (nonatomic, assign) BOOL allowsRotation;
@end
你可以看到,它有一个allowsRotation
属性,任何其他对象都可以设置。
要为allowsRotation
设置NO
以外的默认值,您可以覆盖initWithCoder:
,这是您在Interface Builder中设置视图时所使用的内容做的:
#import "CustomSCNView.h"
@implementation CustomSCNView
- (id)initWithCoder:(NSCoder *)coder {
if ((self = [super initWithCoder:coder])) {
_allowsRotation = YES;
}
return self;
}
@end
然后,ViewController对IBOutlet
两个CustomSCNView
都有#import <Cocoa/Cocoa.h>
#import <SceneKit/SceneKit.h>
@class CustomSCNView;
@interface ViewController : NSViewController
@property (weak) IBOutlet CustomSCNView *sView1;
@property (weak) IBOutlet CustomSCNView *sView2;
@end
个。{/ p>
#import "ViewController.h"
#import "CustomSCNView.h"
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
_sView1.allowsRotation = NO;
_sView2.allowsRotation = YES;
}
@end
ViewController.m:
viewDidLoad
您可以在allowsRotation
中看到,您可以将两个视图的CustomSCNView
属性设置为您想要的任何内容。运行此应用程序时,会在加载storyboard / nib文件时自动(通过initWithCoder:
)为您创建2个CustomSCNView
实例。无需创建title_can_change.property
的另一个实例,以便能够设置您已有的2个现有实例的属性。
答案 1 :(得分:0)
如果您查看SCNView
的{{3}},则会告诉您:
您可以使用
initWithFrame:options:
创建SceneKit视图 方法或将其添加到nib文件或故事板。
因此,除非您已使用init
方法调用[CustomSCNView init]
,否则无法使用[super initWithFrame:options:]
方法。
答案 2 :(得分:0)
如果需要从Interface Builder访问自定义子类属性,请标记这些属性IBInspectable
(并可能实现IBDesignable
)。那是documented by Apple here和nicely summarized on NSHipster。
在任何初始化路径中,您必须调用超类的指定初始值设定项。对于SCNView
,似乎是initWithFrame:options:
(没有记录,但标题强烈暗示它)。请参阅此document on multiple initializers and subclassing。
尽管如此,子类SCNView
是一种代码气味,你可能会对框架进行打击并且工作太辛苦。