Ios 自定义SCNView的init方法
我已经创建了一个从SCNView继承的自定义类CustomSCNView。我想在另一个视图控制器中使用自定义类。所以我需要创建一个CustomSCNView对象,并将其用于另一个类来操作东西。但是如何在另一个类中创建CustomSCNView对象呢。 这不起作用:Ios 自定义SCNView的init方法,ios,objective-c,xcode,scenekit,Ios,Objective C,Xcode,Scenekit,我已经创建了一个从SCNView继承的自定义类CustomSCNView。我想在另一个视图控制器中使用自定义类。所以我需要创建一个CustomSCNView对象,并将其用于另一个类来操作东西。但是如何在另一个类中创建CustomSCNView对象呢。 这不起作用: CustomSCNView *customView = [[CustomSCNView alloc]init]; //in viewcontroller.m 抱歉,忘了提及我使用界面生成器将SCNView拖到视图控制器,然后将其类设
CustomSCNView *customView = [[CustomSCNView alloc]init]; //in viewcontroller.m
抱歉,忘了提及我使用界面生成器将SCNView拖到视图控制器,然后将其类设置为CustomSCNView。如果查看for SCNView,它会告诉您:
您可以使用其initWithFrame:选项创建SceneKit视图:
方法或将其添加到nib文件或情节提要中
因此,除非实现了[CustomSCNView init]方法来调用[super initWithFrame:options:]。如果需要从Interface Builder访问自定义子类属性,请将这些属性标记为IBInspectable,并可能实现IBDesignable。那是,而且 在任何初始化路径中,都必须调用超类的指定初始值设定项。对于SCNView,这似乎是initWithFrame:options:没有这样记录,但标题强烈暗示了这一点。看这个
尽管如此,子类化SCNView是一种代码味道,您可能正在与框架抗争,并且工作过于努力。我对您的问题有点困惑,但我已经创建了一个示例项目,它可能会满足您的要求 首先,故事板在ViewController的视图中有两个并排布置的自定义CnView。和您一样,我将2个SCNView从IB调色板拖到视图中,然后将自定义类设置为CustomSCNView 其次是CustomSCNView类,其定义如下:
#import <Cocoa/Cocoa.h>
#import <SceneKit/SceneKit.h>
@interface CustomSCNView : SCNView
@property (nonatomic, assign) BOOL allowsRotation;
@end
然后,ViewController有2个IBOutlet连接到两个CustomSCNViews
可以看到,在viewDidLoad中,可以将两个视图的allowsRotation属性设置为所需的任何值。运行此应用程序时,加载情节提要/nib文件时,将通过initWithCoder:,自动为您创建2个CustomSCNView实例。不需要创建CustomSCNView的另一个实例就可以设置您已有的两个现有实例的属性。我有一个愚蠢但必要的问题,您是否在另一个类中添加了CustomSCNView的导入语句?您是否尝试过-initWithFrame:options:?是的。我没有为CustomSCNView类创建init方法。我假设[[CustomSCNView alloc]init]可以工作。那么我可以调用该方法-initWithFrame:options:而不在CustomSCNView.m中初始化它吗?initWithFrame方法也不工作。因此,我所做的是将一个SCNView拖到视图控制器,并在main.storyboard中设置约束。然后将SCNView的类设置为CustomSCNView.@Harshil.Chokshi您的问题中没有提到这一点。我认为这样做应该有效。对不起,编辑了我的问题。由于某种原因,[[CustomSCNView alloc]init]无法工作。你想让我发布类的代码吗?@Harshil.Chokshi你不能使用[CustomSCNView alloc]init]方法,如我在回答中所述。那么,如果我使用main.storyboard,我应该使用什么方法?我不能使用initWithFrame方法,因为我使用故事板创建SCNView,它的大小取决于屏幕的大小。是的,我同意。我之所以需要这样做,是因为我希望某些对象通过触摸旋转,而某些对象不旋转。因此,我认为一个sceneview允许旋转,而另一个不允许。不工作不是一个非常有用的描述。编辑您的原始问题,向我们展示CustomSCNView的init和initWithFrame:methods,并为我们提供错误行为和错误消息的精确描述。谢谢!问题是我只是将属性赋值为非原子,而不是赋值
#import "CustomSCNView.h"
@implementation CustomSCNView
- (id)initWithCoder:(NSCoder *)coder {
if ((self = [super initWithCoder:coder])) {
_allowsRotation = YES;
}
return self;
}
@end
#import <Cocoa/Cocoa.h>
#import <SceneKit/SceneKit.h>
@class CustomSCNView;
@interface ViewController : NSViewController
@property (weak) IBOutlet CustomSCNView *sView1;
@property (weak) IBOutlet CustomSCNView *sView2;
@end
#import "ViewController.h"
#import "CustomSCNView.h"
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
_sView1.allowsRotation = NO;
_sView2.allowsRotation = YES;
}
@end