2016-03-28 93 views
-3

我创建了一个从SCNView继承的自定义类“CustomSCNView”。我想在另一个视图控制器中使用自定义类。所以我需要创建一个CustomSCNView对象并将其用于另一个类来操作事物。但是我怎样才能在另一个类中创建一个CustomSCNView对象。 这不是工作:自定义SCNView的初始化方法

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

对不起忘了提余使用的接口构建器一个SCNView拖到视图控制器,然后它的类设置为CustomSCNView。

+0

我有一个愚蠢的,但必要的问题,你是否在其他类中添加CustomSCNView的导入语句? – fsb

+0

你有没有尝试过'-initWithFrame:options:'? – mnuages

+0

是的,我做到了。我没有为CustomSCNView类创建一个init方法。我认为[[CustomSCNView alloc] init]可以工作。 –

回答

1

我对你的问题有点困惑,但我在https://github.com/NSGod/CustomSCNView上创建了一个示例项目,它可以做你正在寻找的东西。

首先,在ViewController的视图中,故事板上并排摆放了2个CustomSCNView。和你一样,我从IB调色板拖动2 SCNView到视图,然后将自定义类设置为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 

的视图控制器则有2 IBOutlet s到CustomSCNView s。

#import <Cocoa/Cocoa.h> 
#import <SceneKit/SceneKit.h> 

@class CustomSCNView; 

@interface ViewController : NSViewController 

@property (weak) IBOutlet CustomSCNView *sView1; 
@property (weak) IBOutlet CustomSCNView *sView2; 

@end 

ViewController。L:

#import "ViewController.h" 
#import "CustomSCNView.h" 

@implementation ViewController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    _sView1.allowsRotation = NO; 
    _sView2.allowsRotation = YES; 
} 

@end 

你可以看到,在viewDidLoad,你可以设置任何你想要两个视图中allowsRotation财产。当您运行此应用程序时,会自动为您创建两个CustomSCNView实例(通过initWithCoder:),当加载故事板/笔尖文件时。无需创建CustomSCNView的另一个实例即可设置已有的2个现有实例的属性。

+0

谢谢!问题是我只是将属性分配为非原子,而不是分配 –

0

如果你看一下documentationSCNView它告诉你:

您可以通过使用其initWithFrame:options: 方法或通过将其添加到笔尖文件或故事板创建SceneKit视图。

所以你不能使用init方法,除非你已经实现了你的[CustomSCNView init]方法调用[super initWithFrame:options:]

+0

所以我所做的就是将SCNView拖到视图控制器并在main.storyboard中设置约束。然后将SCNView的类设置为CustomSCNView。 –

+0

@ Harshil.Chokshi在你的问题中没有提到这一点。我认为这应该起作用。 – trojanfoe

+0

对不起编辑我的问题。出于某种原因[[CustomSCNView alloc] init]不起作用。你想让我发布课程代码吗? –

0

如果您需要从Interface Builder访问自定义子类属性,请标记这些属性IBInspectable(并可能实施IBDesignable)。那是documented by Apple herenicely summarized on NSHipster

在任何初始化路径中,您必须调用超类的指定初始化程序。对于SCNView,似乎是initWithFrame:options:(没有记录,但标题强烈暗示它)。看到这个document on multiple initializers and subclassing

尽管如此,子类化SCNView是一种代码异味,您可能正在与框架作斗争并且努力工作。

+0

是的,我同意。我需要这样做的原因是因为我想要一些对象通过触摸旋转并且一些对象不旋转。所以我只有一个sceneview允许旋转,而另一个不能。 –

+0

不幸的是,没有奏效。 –

+0

“没有工作”不是一个非常有用的描述。编辑您的原始问题,向我们展示'CustomSCNView'的'init'和'initWithFrame:'方法,并为我们提供错误行为和错误消息的精确描述。 –