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

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

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

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

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

Swift

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

Q&A

解決済

2回答

4407閲覧

Xibファイルを後から定義するとクラッシュしてしまう

hodoru3sei

総合スコア284

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

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

Swift

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

0グッド

0クリップ

投稿2019/07/23 07:10

編集2019/07/23 07:39

ViewControllerのレイアウトをXibで組みたいと考えています。
新規でUIViewControllerを作るときはチェックをつければxibファイルが勝手にできてくれますが、既存のViewControllerにどの様に紐づければ良いのかわかりません。

試したこと

画像の様にFile's OwnerのクラスにViewControllerを設定しました。
しかしこの状態だと紐付けたUISwitchの要素にアクセスしようとするとoptionalでクラッシュしてしまいます。
イメージ説明
File's Owner以外で何か設定が必要なのでしょうか?

###追記
UISwitchを繋いでいる部分です。

Swift

1 @IBOutlet weak var mySwitch: UISwitch! 2 override func viewDidLoad() { 3 super.viewDidLoad() 4 // Do any additional setup after loading the view. 5 mySwitch.backgroundColor = .red 6 }

エラーメッセージは以下の様に表示されます

Fatal error: Unexpectedly found nil while implicitly unwrapping an Optional value 2019-07-23 16:39:04.377294+0900 Xib test[12466:728503] Fatal error: Unexpectedly found nil while implicitly unwrapping an Optional value

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

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

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

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

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

takabosoft

2019/07/23 07:17

Orner→Ownerでしょうか。 このxibファイルを使ってViewControllerを構築しているコードを載せてください。
fuzzball

2019/07/23 07:18

とりあえずエラーメッセージ書いて下さい。
fuzzball

2019/07/23 07:35

UISwitchのアウトレット繋いでないとか。 「後から定義すると」っていうことだから違っていて欲しいけど‥。
hodoru3sei

2019/07/23 07:40

ありがとうござます コードとエラーメッセージを追加しました。
fuzzball

2019/07/23 07:43

takabosoftさんが欲しいのは、ViewControllerのviewと、xibを紐付けているコードでしょう。たぶん。
takabosoft

2019/07/23 07:50 編集

ですです。このxibを指定してViewContollerのインスタンスを生成しているコードを見せてください。 (たぶんそこの構築方法が間違ってると思って聞いています^^;)
hodoru3sei

2019/07/23 07:56

指定はFile's Ownerの部分だけしかしていませんでした。 Also create XIB fileにチェックを入れて時のviewControllerを見てみたのですがxibを紐付けているコードはどれに当たるのかわかりませんでした。 手動で作る時のみ必要なコードがあるのでしょうか?
takabosoft

2019/07/23 08:00

あ、Storyboardを使わずに初期画面をxibで作ったViewControllerにしたいって事ですかね?
fuzzball

2019/07/23 08:01

「同時にxibを作ったとき」も紐付けのコードは生成してくれませんけど、「同時にxibを作ったとき」は正しく動いているのではないのですか? 結局、「後から定義すると」ってのは関係無いって話ですかね。
takabosoft

2019/07/23 08:04

私は勘違いしてるかも、ちょっと調べてきます。
hodoru3sei

2019/07/23 08:18

説明足らずですみません。 まず、新規にUIViewControllerを追加する際にAlso create XIB fileにチェックを入れるとUIViewControllerに紐づいたxibファイルが自動生成されていてUIを配置して紐づけた後値を操作してもクラッシュしていません。 今回わからないのは既存のUIViewController(初期化時にAlso create XIB fileにチェックを入れていないもの)に対してどの様にxibファイルの紐付けを行えばいいかです。 Also create XIB fileにチェックを入れて作成したものと見比べたところ自動生成したXIBにはFile's Ownerが設定されていたのでFile's Ownerを決めればAlso create XIB fileにチェックを入れたものと同様にUIを扱えるとおもっていました。しかし現状Optionalでクラッシュしてしまう状況です。
fuzzball

2019/07/23 08:24

そのViewControllerはどうやって生成しているのでしょうか? もうコード全部書きませんか?大した量じゃないでしょ。
takabosoft

2019/07/23 08:26

再現する単純なプロジェクトをgithubとかにあげてもらえばこちらでも調査しますよ。
hodoru3sei

2019/07/23 08:28

ViewControllerのコードはほとんど初期状態です。 プロジェクト生成時に作成されるViewControllerを使っているのでrootViewの変更もしていません。 以下のコードが全てになります。 ``` import UIKit class ViewController: UIViewController { @IBOutlet weak var mySwitch: UISwitch! override func viewDidLoad() { super.viewDidLoad() mySwitch.backgroundColor = .red } } ```
takabosoft

2019/07/23 08:33 編集

例えば「Single View App」で新規プロジェクトを作るとViewControllerはstoryboardに紐付いていませんかね? そうなるとstoryboardを使ってViewControllerが生成されるようになっているはずなので、まずStoryboard関連の処理を全部削除して自分でWindow作ったりrootViewControllerを設定したりしないといけないと思いますが。
takabosoft

2019/07/23 08:34

んー、でも「後からだと駄目」って言っているので違うかな・・・うーん。
takabosoft

2019/07/23 08:35

少なくとも起動時一発目に出るViewControllerの話ではないんですかね?
takabosoft

2019/07/23 08:47 編集

回答をアップデートしました。 自分でViewController.swiftを追加後、ViewController.xibファイルをEmptyで作成し、ViewやUISwitchが紐づくところまで確認しました。 いろいろ勘違いしてすみません。上の3つは忘れてください。
fuzzball

2019/07/23 08:47 編集

>>hodoru3sei 2019/07/23 17:28 それって正しく動作しないときの話ですよね? 正しく動作するときのプロジェクトの作成手順を教えて下さい。
hodoru3sei

2019/07/23 08:54

takabosoftさんに指摘していただいた通りxibとFile's ownerファイルの接続ができていませんでした。 接続したところクラッシュは起こらなくなりました
guest

回答2

0

ベストアンサー

調べてきました。

そのxibのファイル名部分とViewControllerのクラス名部分は一緒でしょうか?
手元で確認した感じクラス名と一緒のxibファイルがあれば勝手に紐づけてくれました(てっきり手動で紐付けないといけないかと思っていました。)

もしクラス名とxibファイル名が違うのでしたら、手動で
let myVC = MyViewController(nibName: "hogehoge", bundle: nil)
(※.xibの拡張子は入れない)
のようにコンストラクタで明示的に指定する必要があるようです。


追記:

たぶん、viewをFile's Ownerのviewに紐づけて無いんじゃないでしょうか?
イメージ説明

投稿2019/07/23 08:19

編集2019/07/23 08:42
takabosoft

総合スコア8356

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

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

hodoru3sei

2019/07/23 08:52

できました! ありがとうございます!!
fuzzball

2019/07/23 09:40

>>手元で確認した感じクラス名と一緒のxibファイルがあれば勝手に紐づけてくれました というのがよく分からない(紐付かない)ので出直してきます‥。
takabosoft

2019/07/24 00:22 編集

class Hoge だったら Hoge.xibファイルを勝手に読み込んでくれる的な感じです。 自分は明示的にHoge(nibName: "Hoge", bundle: nil)と絶対に書かないといけないと思いこんでいたのですが、Hoge()と書いてインスタンスを生成してもHoge.xibがあれば勝手にxibがロードされましたので。 ※昔からUIは全部コードで定義しちゃってるので、この辺の知識がそもそも浅いです。
fuzzball

2019/07/24 00:35

色々試してたんですけど勝手に読み込んでくれないんですよね‥。また後で調べてみます。 私も基本はコードかStoryboardなのでxibはあまり使い慣れていません。使いこなしたい気持ちはあるので機会があれば勉強中です。
guest

0

File's OwnerCustom Classで自身が作ったクラスを指定するのではなく、 実際にそのxibファイルに置いたUIViewControllerのパーツのCustom Classでクラスを指定します。(質問のスクショでいうと、青く選択されているFile's Ownerのアイコンから2つ下にあるものです。)

その修正を行い、再度UISwitchなどのOutletViewControllerのソースコードと接続し直して下さい。

この質問で1点気になるのは、xibファイル上に置いたパーツは、UIViewControllerではなく、UIViewなのではないでしょうか。
UIViewControllerをxibファイルに置き、そのCustom Classで対象としたいViewControllerを指定してください。

投稿2019/07/23 08:07

編集2019/07/23 08:09
betat

総合スコア53

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

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

fuzzball

2019/07/23 08:15

ViewController(のself.view)をxibで作るって話ですよ。たぶん。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問