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

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

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

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

Xcode

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

Swift

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

iPhone

iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

Q&A

1回答

2570閲覧

[Swift3]メインViewに追加したSubviewのIBOutletがエラーになる。

fuyukun

総合スコア4

iOS

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

Xcode

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

Swift

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

iPhone

iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

0グッド

0クリップ

投稿2017/03/03 10:32

編集2022/01/12 10:55

SubView(xib)からViewControllerに接続したIBOutletが使えない。

UIViewController(以下hogeViewController)クラスのviewDidLoad()内で、

let subView:UIView = UINib(nibName: "hogeSubView", bundle: nil).instantiate(withOwner: nil, options: nil)[0] as! UIView self.view.addSubview(subView)

という感じでカスタムxibからUIViewを生成して、UIViewControllerのviewにaddSubviewしています。

このhobeSubViewにはButtonを配置して、hogeViewControllerにIBOutletとして接続しています。(Ctrl+Dragにて)

@IBOutlet weak var button: UIButton!

ビルドは通るのですが、hogeViewControllerのビューを表示すると以下のエラーがでます。
hogeSubView.xibファイルのFile's OwnerもhogeViewControllerに設定しています。

@IBOutletではなく、@IBActionだと、動作します。

何かxibとコントローラーの接続設定で足りていないものがあるのでしょうか?
もしくは、そもそもViewとコントローラーの関係を間違って認識しているのでしょうか?

###エラーメッセージ

'NSUnknownKeyException', reason: '[<NSObject 0x17001eab0> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key button.'

どうぞ宜しくお願いします。

###追記

上記は、hogeViewControllerのviewDidLoad()内でxibを読み込んでaddSubviewしていますが、
別のコントローラー A_ViewController内で
let vc = hogeViewController(nibName: "hogeSubView", bundle: nil)
という感じで、ViewControllerにxibの引数を渡して初期化すると上記エラーもなく、IBOutletおよびIBActionともに正常に呼べました。

以下のxibの読み込み方では、ControllerとIBOutletがうまく接続されない感じなのですが、理由はわからないままです。

let subView:UIView = UINib(nibName: "hogeSubView", bundle: nil).instantiate(withOwner: nil, options: nil)[0] as! UIView self.view.addSubview(subView)

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

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

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

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

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

guest

回答1

0

@IBOutletではなく、@IBActionだと、動作します。

ちゃんと設定している場合はどちらも問題なく動くと思います。

原因としては@IBOutletで結んだ後に名前を変更したりしたのでは無いでしょうか。
一旦接続を解除して結び直すと治ると思います。

投稿2017/03/04 06:00

_Kentarou

総合スコア8490

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

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

fuyukun

2017/03/06 10:32

ありがとうございます! 何度か、接続の結び直しと名前の確認をしたのですが、やはりIBOutletだけ上記エラーになるので、今一度洗い直してみます。 何かわかれば、再度情報を共有させていただきます。
fuyukun

2017/03/09 15:54

追記をさせていただきました。 xibを引数にして、ViewControllerオブジェクトを生成したら、IB関係は正常に接続されており、エラーもなく正常動作しました。 viewDidLoad()内で、xibをUIViewとして読み込んで、addSubviewするとIBOutletの接続が切れる?(というか、接続されていない?)ようです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問