[解決済み] ビューコントローラを別のビューコントローラのサブビューとして追加する
質問
この問題に対するいくつかの投稿を見つけましたが、どれも私の問題を解決してくれませんでした。
私がしたように言う...
- ビューコントローラA
- ビューコントローラB
ViewControllerAにViewControllerBをサブビューとして追加しようとしましたが、"のようなエラーを投げています。
fatal error: unexpectedly found nil while unwrapping an Optional value
というエラーが発生します。
以下はそのコードです...
ビューコントローラA
var testVC: ViewControllerB = ViewControllerB();
override func viewDidLoad()
{
super.viewDidLoad()
self.testVC.view.frame = CGRectMake(0, 0, 350, 450);
self.view.addSubview(testVC.view);
// Do any additional setup after loading the view.
}
ViewControllerBは、ラベルが入っただけのシンプルな画面です。
ViewControllerB
@IBOutlet weak var test: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
test.text = "Success" // Throws ERROR here "fatal error: unexpectedly found nil while unwrapping an Optional value"
}
EDIT
ユーザー回答にあった解決策で、ViewControllerA内のViewControllerBが画面外に出てしまうのですが、どうしたらいいでしょうか?グレーの枠はサブビューに作った枠です。
どのように解決するのですか?
いくつかの意見を述べます。
-
2つ目のビューコントローラをインスタンス化するとき、あなたは
ViewControllerB()
. もしそのビューコントローラがプログラムでビューを作成するのであれば(これは珍しいことですが)、それは問題ないでしょう。しかしIBOutlet
の存在は、この2番目のビューコントローラのシーンがInterface Builderで定義されたことを示唆しますが、その際にViewControllerB()
を呼び出すことによって、ストーリーボードにそのシーンをインスタンス化し、すべてのアウトレットをフックする機会を与えていないことになります。したがって、暗黙のうちにアンラップされたUILabel
はnil
であり、エラーメッセージが表示されます。その代わりに、Interface Builderで目的地のビューコントローラに "ストーリーボードID" を与え、その上で
instantiateViewController(withIdentifier:)
を使ってインスタンス化します(そして、すべての IB アウトレットをフックします)。Swift 3では。let controller = storyboard!.instantiateViewController(withIdentifier: "scene storyboard id")
これで、この
controller
'sview
. -
しかし、本当にやりたいのであれば
addSubview
(を本当に行いたいのであれば(つまり、次のシーンに遷移しないのであれば)、あなたは "ビューコントローラーの格納と呼ばれる行為を行っていることになります。単純にaddSubview
. あなたは、例えば、いくつかの追加のコンテナビューコントローラの呼び出しを行いたいと思います。let controller = storyboard!.instantiateViewController(withIdentifier: "scene storyboard id") addChild(controller) controller.view.frame = ... // or, better, turn off `translatesAutoresizingMaskIntoConstraints` and then define constraints for this subview view.addSubview(controller.view) controller.didMove(toParent: self)
なぜこの
addChild
(以前はaddChildViewController
) とdidMove(toParent:)
(以前はdidMove(toParentViewController:)
) が必要な場合は WWDC 2011 ビデオ #102 - UIViewController のコンテインメントの実装 . 要するに、ビューコントローラの階層がビューの階層と同期していることを確認する必要があり、これらの呼び出しはaddChild
とdidMove(toParent:)
がそうであることを確認します。も参照してください。 カスタムコンテナビューコントローラの作成 を参照してください。 ビューコントローラ プログラミングガイド" を参照してください。
ところで、上記はプログラム的にこれを行う方法を示しています。実際はInterface Builderのquot;container view"を使うと、もっと簡単です。
そうすれば、これらのコンテント関連の呼び出しについて心配する必要はありませんし、Interface Builderが代わりに処理してくれるでしょう。
Swift 2 の実装については この回答の以前の改訂版 .
関連
-
[解決済み】「Fatal error: Unexpectedly found nil while unwrapping an Optional value "とはどういう意味ですか?
-
EXC_BAD_ACCESS (code=2, address=0x0)
-
iOSコンパイルポッドでエラー CocoaPods could not find compatible versions for pod "XXXXX" が報告される。
-
[解決済み] Xcode 6.3 - 現在の iOS Development 証明書または保留中の証明書要求がすでにあります。
-
[解決済み] UITextViewのマージン/パディングをなくす方法
-
[解決済み] アプリのプレビュー用にiOSシミュレータのビデオをキャプチャー
-
[解決済み] iOSとWatchKitで画像のtintColorを変更する方法
-
[解決済み] iOS 7でステータスバーとナビゲーションバーがビューの境界を越えて表示される
-
[解決済み] セキュリティで保護されたWebサービスにもアクセスするiOSアプリで、Facebook認証を行うためのデザイン
-
[解決済み] swiftで電子メールアドレスを検証する方法は?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[エラー処理】iOSのエラー、アーキテクチャx86_64の未定義シンボルについて
-
XCode のコンパイル例外を解決する clang: error: linker command failed with exit code 1
-
[解決済み] UITableViewの選択を無効にするにはどうすればよいですか?
-
[解決済み] Objective-Cでデリゲートを作成するにはどうしたらいいですか?
-
[解決済み] SwiftでURLから画像を読み込む/ダウンロードする
-
[解決済み] UILabelで複数行のテキストを表示する
-
[解決済み] UIViewの角丸とドロップシャドウ?
-
[解決済み] Swiftの配列を文字列に変換するには?
-
[解決済み] Swiftのプロトコルでオプションのメソッドを定義するには?
-
[解決済み] iOSアプリをApple Developer Programや脱獄せずにデバイス上でテストすることができます。