2016-03-28 14 views
-3

SCNViewから継承するカスタムクラス "CustomSCNView"を作成しました。別のビューコントローラでカスタムクラスを使用したいです。ですから、私はCustomSCNViewオブジェクトを作成し、それを別のクラスに使用して操作する必要があります。しかし、別のクラスでCustomSCNViewオブジェクトを作成するにはどうしたらいいですか? これが動作していません。カスタムSCNViewのinitメソッド

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に設定しました。

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

@interface CustomSCNView : SCNView 

@property (nonatomic, assign) BOOL allowsRotation; 

@end 

あなたが見ることができるが、それは他のオブジェクトを設定することができallowsRotation性質を持っています

第二には、次のように定義されてCustomSCNViewクラスです。

NO以外allowsRotationのデフォルト値を設定するには、あなたがビューを設定したときと同じようにInterface Builderで使用しているものであるinitWithCoder:を上書きすることができますが:

#import "CustomSCNView.h" 

@implementation CustomSCNView 

- (id)initWithCoder:(NSCoder *)coder { 
    if ((self = [super initWithCoder:coder])) { 
     _allowsRotation = YES; 
    } 
    return self; 
} 
@end 

のViewControllerが、その後2 IBOutletを持っていますsを両方とも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 

ViewController。M:

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

@implementation ViewController 

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

@end 

あなたはviewDidLoadで、あなたが好きに両方のビューのallowsRotationプロパティを設定することができていることがわかります。このアプリケーションを実行すると、CustomSCNViewという2つのインスタンスが自動的に作成されます(initWithCoder:経由).styleboard/nibファイルがロードされます。既に持っている2つの既存のインスタンスのプロパティを設定できるように、CustomSCNViewの別のインスタンスを作成する必要はありません。

+0

ありがとう!問題は、プロパティを割り当てていないだけで、非アトミックな –

0

あなたがSCNViewためdocumentationを見れば、それはあなたに伝えます:

あなたは、そのinitWithFrame:options: 方法を使用するか、nibファイルやストーリーボードに追加しSceneKitビューを作成することができます。

あなたが[super initWithFrame:options:]を呼び出すためにあなたの[CustomSCNView init]メソッドを実装していない限り、あなたはinitメソッドを使用することはできません。

+0

それでは、SCNViewをView Controllerにドラッグし、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

そうです、私は同意します。私はそれを行う必要がある理由は、いくつかのオブジェクトをタッチで回転させ、いくつかのオブジェクトを回転させたくないからです。だから、私は1つのシーンビューで回転を許していますが、もう1つのシーンビューでは回転できません。 –

+0

残念ながら、それはうまくいきませんでした。 –

+0

"うまくいかなかった"という説明はあまり役に立ちません。元の質問を編集して、 'CustomSCNView'の' init'と 'initWithFrame:'メソッドを表示して、不正行為とエラーメッセージの正確な記述を与えてください。 –

関連する問題