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

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

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

Interface BuilderとはApple"s Mac OsXとiOS ぷラットフォームのユーザーインターフェイスを作るために使用されるビジュアルデザインツールです。

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回答

908閲覧

CustomViewに値を渡したい

hodoru3sei

総合スコア284

Interface Builder

Interface BuilderとはApple"s Mac OsXとiOS ぷラットフォームのユーザーインターフェイスを作るために使用されるビジュアルデザインツールです。

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グッド

1クリップ

投稿2019/05/21 10:04

現状

ゲームのスコア画面でスコアによって画面を切り替えたいと考え、LoadViewで以下のように出し分けを行なっています。

Swift

1override func loadView() { 2 if score == 10 { 3 self.view = ResultGoodView() 4 } else if score > 5 { 5 self.view = ResultNormalView() 6 } else { 7 self.view = ResultBadView() 8 } 9 }

CustomViewの作成方法はカスタムビューを利用してビューを再利用の記事を参考に作成しました。

###こまっていること
Result画面からそれぞれのカスタムビューに対してscoreの値をLabelに入れたいと考えているのですが、どのように実装して良いのかわからず困っています。

試した事

viewControllerから参照する

以下のようにViewController側でlabelを参照しようとするとUIViewはLabelを保持していない為エラーになってしまいます。

Swift

1 override func loadView() { 2 if score == 10 { 3 self.view = ResultGoodView() 4 self.view.label.text = "(score)点" 5 } else if score > 5 { 6 self.view = ResultNormalView() 7 self.view.label.text = "(score)点" 8 } else { 9 self.view = ResultBadView() 10 self.view.label.text = "(score)点" 11 } 12 }

error

1Value of type 'UIView?' has no member 'label'

initializerで値を入れる

customViewにイニシャライザを作ってscoreを内部に持たせてlabelのtextに反映させようとしてみました。

Swift

1//呼び出し元 2   self.view = ResultBadView(frame: self.view.frame, score: score)

Swift

1//customView 2   var score: Int? 3 init(frame: CGRect, score: Int){ 4 self.score = score 5 super.init(frame: frame) 6 loadFromNib() 7 } 8 private func loadFromNib() { 9 let v = UINib(nibName: "ResultBadView", bundle: Bundle(for: ResultGoodView.self)).instantiate(withOwner: self, options: nil)[0] as! UIView 10 v.frame = self.bounds 11 label.text = "(score!)/10\" 12 addSubview(v) 13 }

この状態で実行をすると以下のエラーが出てしまいアプリがクラッシュしてしまいます。

error

1Thread 1: EXC_BAD_ACCESS (code=2, address=0x16b307fa0)

エラーでしらべてみたところCustomClassが間違っていることが問題?のように書かれていてもしかしたらinitializerを増やすこと自体無理なのかもと思っています。
どのように実装するれば値を渡すことができるでしょうか?

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

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

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

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

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

guest

回答1

0

ベストアンサー

以下の様にしてみてください。

Swift

1let customView = ResultGoodView() 2customView.label.text = "(score)点" 3self.view = customView

self.viewの型はUIView?であり、中身がCustomViewでもUIViewとして扱うため、CustomViewで追加したプロパティは参照できません。
従って、CustomViewと認識できる形で変数を作成し、CustomViewのプロパティを変更します。
そしてself.viewに格納します。

投稿2019/05/21 10:27

dsuzuki

総合スコア1682

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

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

hodoru3sei

2019/05/21 10:35

なるほど!勉強になりました ありがとうございます!!!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問