質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

1回答

1709閲覧

Xcodeのストーリーボード上のViewControllerをコードで取得したい

kntp20

総合スコア4

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2019/12/25 14:28

こんにちは。
初心者です。3時間ほど粘りましたがわからないので質問させていただきます。
タイトル通りOSXのプロジェクトにおいて
Main.storyboardに設置したViewControllerをコード上で取得したいのですがうまくいきません。

let sb = NSStoryboard(name: "Main", bundle: nil)
let vc = sb.instantiateInitialController() as! ViewController
let vc2 = sb.instantiateController(withIdentifier: "MainView") as! ViewController

self,vc,vc2のviewが一致しないのはなぜなのでしょうか?

main.storyboard上の設定では
ViewControllerのisInitialController=true,
StoryBoardID="MainView"

としており問題ないとは思うのですが・・
最終的にはコード上でUIを作成してviewに追加したいのでviewを一致させたいのですが
うまくいかないのは私の把握漏れなのでしょうか?
わかる方よろしくおねがいします

以下ソースコードです

swift

1import Cocoa 2 3class ViewController: NSViewController{ 4 5 override func viewWillAppear() { 6 super.viewWillAppear() 7 8 let sb = NSStoryboard(name: "Main", bundle: nil) 9 let vc = sb.instantiateInitialController() as! ViewController 10 let vc2 = sb.instantiateController(withIdentifier: "MainView") as! ViewController 11     //self,vc,vc2はどれもmain.storyboardのViewControllerを取得してくると想定してたが 12 //どれも一致しない・・・なぜ? 13 14     //→false 15 if(vc.view==self.view){ 16 print("true") 17 } 18 else{ 19 print("false") 20 } 21 22 //→false 23 if(vc2.view == self.view) { 24 print("true") 25 } 26 else { 27 print("false") 28 } 29 30 //→false 31 if(vc.view == vc2.view) { 32 print("true") 33 } 34 else { 35 print("false") 36 } 37 38 } 39} 40 41

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

Main.storyboardに設置したViewControllerをコード上で取得したいのですがうまくいきません。

selfが取得したいViewControllerかと思います

self,vc,vc2のviewが一致しないのはなぜなのでしょうか?

sbにはNSStoryBoardのインスタンスを生成・格納していますが、これはselfを保持するNSStoryBoardと異なるインスタンスです
ですのでvc, vc2もselfとは異なるインスタンスでありviewが一致しないのではないでしょうか

投稿2019/12/25 14:39

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kntp20

2019/12/25 15:10

コメントありがとうございます。 NSStoryboardのインスタンスが違うのですか? てっきりストーリーボード上のインスタンスをそのままそっくり持ってきてコード上で細かい調整ができるのかと思ったのですが 分かりにくい部分を補足しておくとselfはMain.storyboardに配置したViewContorollerのCustomClassを="ViewController.swift"と設定して呼び出されたものです let sb = NSStoryboard(name: "Main", bundle: nil)の"Main"部分を別名にするとエラーが出るので間違ってはなさそうなのですが、他にいい感じの方法があるのでしょうか?
AOKINAO

2019/12/25 23:31

instantiateInitialController(), instantiateController(name:bundle)は、名前のとおりインスタンスを作る関数です。
退会済みユーザー

退会済みユーザー

2019/12/26 12:55

Storyboardに設定したViewControllerのインスタンスが必要なのであれば、それはselfです self.viewに格納されているNSViewを変更すれば細かい調整は可能です また、Storyboardのインスタンスが必要であればself.storyboardに格納されています let sb = NSStoryboard(name: "Main", bundle: nil)は新しいインスタンスを生成するものであり不要な記述です
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問