自定义SCNView的init方法

时间:2016-03-28 16:29:29

标签: ios objective-c xcode scenekit

我创建了一个自定义类" CustomSCNView"继承自SCNView。我想在另一个视图控制器中使用自定义类。所以我需要创建一个CustomSCNView对象并将其用于另一个类来操作。但是如何在另一个类中创建CustomSCNView对象。 这不起作用:

CustomSCNView *customView = [[CustomSCNView alloc]init]; //in viewcontroller.m

很抱歉忘了提到我使用界面构建器将SCNView拖动到视图控制器,然后将其类设置为CustomSCNView。

3 个答案:

答案 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 herenicely summarized on NSHipster

在任何初始化路径中,您必须调用超类的指定初始值设定项。对于SCNView,似乎是initWithFrame:options:(没有记录,但标题强烈暗示它)。请参阅此document on multiple initializers and subclassing

尽管如此,子类SCNView是一种代码气味,你可能会对框架进行打击并且工作太辛苦。