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

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

新規登録して質問してみよう
ただいま回答率
85.50%
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

1回答

1687閲覧

カスタムViewをnibから作ろうとした時にクラッシュしてしまう

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クリップ

投稿2020/05/26 07:53

カスタムViewをNibから初期化の最新版こちらの記事を参考にカスタムViewをnibから初期化しようと考えているのですが以下のようなエラーが表示されクラッシュしてしまいます。
イメージ説明

独自で作ったcutomViewは以下のとうりです。

Swift

1class CustomView: UINibView { 2 3 @IBOutlet weak var label: UILabel! 4}

参照先にあったコードもそのままでは動かなかったので以下のように修正をしました。

class UINibView: UIView { // コードから初期化はここから override init(frame: CGRect) { super.init(frame: frame) comminInit() } // Storyboard/xib から初期化はここから required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) comminInit() } // 初期化後に呼びされる。 func afterInit() {} // xibからカスタムViewを読み込んで準備する private func comminInit() { // MyCustomView.xib からカスタムViewをロードする let bundle = Bundle(for: type(of: self)) let nib = UINib(nibName: "CustomView", bundle: bundle) //swiftlint:disable force_cast let view = nib.instantiate(withOwner: self, options: nil).first as! UIView addSubview(view) // カスタムViewのサイズを自分自身と同じサイズにする view.translatesAutoresizingMaskIntoConstraints = false let bindings = ["view": view] addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|[view]|", options: NSLayoutConstraint.FormatOptions(rawValue: 0), metrics: nil, views: bindings)) addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|[view]|", options: NSLayoutConstraint.FormatOptions(rawValue: 0), metrics: nil, views: bindings)) self.afterInit() } }

どこが間違っているか全くわからず手が止まってしまいました。
どこでミスをしてしまっているのでしょうか?

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

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

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

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

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

guest

回答1

0

let bundle = Bundle(for: type(of: self)) let nib = UINib(nibName: "CustomView", bundle: bundle)

の部分で、CustomView.nibというファイルがプロジェクトに含まれてない可能性が高いと思います。
このファイルが本当にプロジェクトに含まれているかXcodeのプロジェクト内容を確認してみると良いと思います。
たとえば、

bundle.path(forResource: "CustomView", ofType: "nib")

を取得して、nilならファイルが存在しないということです。 なお、.xibファイルはビルド時にコンパイルされて拡張子が.nibに代わったものがアプリに同梱されるので注意です。

試しに、上記2行を

let nib = UINib(nibName: "CustomView", bundle: nil)

でやってみるとメインバンドルからnibをロードしてくれるので、意外とうまくいくかも知れません。
後は、nibの内容の内、クラス名の部分がCustomViewになっているかどうかとか、qiitaの元記事にあるように、referencing outputが付いたままになっているとか考えられます。

ちなみに、下記のドキュメントを読んで、MacOS/iOS特有のBundleとFrameworkの仕組みを知っておくとこの辺のトラブルに強くなると思うのでおすすめです。

Bundle Programming Guide

投稿2020/05/27 00:16

ponpoko1968

総合スコア84

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問