Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 自定义SCNView的init方法_Ios_Objective C_Xcode_Scenekit - Fatal编程技术网

Ios 自定义SCNView的init方法

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拖到视图控制器,然后将其类设

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

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