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

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

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

2658閲覧

親viewの値を子viewで使用したい

Ka_ya_

総合スコア31

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/04/21 08:13

質問失礼します。

スクロールビューが配置されている親viewの値をコンテナビューに配置した子viewにて使用したいのですが、
値が受け渡されず"nil"になってしまいます。
親viewの値を子viewで使用するにはどうすれば良いでしょうか。

どなたかご教授よろしくお願い致します。

親view

swift

1class DetailScrollViewController: UIViewController { 2 3 var titleName = "あ" 4 5 override func viewDidLoad() { 6 super.viewDidLoad() 7 }

子view

swift

1class DetailViewController: UIViewController { 2 3 override func viewDidLoad() { 4 super.viewDidLoad() 5 6 let parent = self.parent as? DetailScrollViewController 7 print(parent?.titleName as Any) 8 }

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

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

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

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

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

Tetsukick

2020/04/21 08:34

print(parent) をしたときにどうなりますか?
Ka_ya_

2020/04/21 08:44

print(parent)をしてもnilになってしまったので、やはり取得出来ていないようです。 親viewから子viewの値を取得するのは let subVC = self.children.first as? RegistrationViewController 上記の記載で可能だったのですが、 子viewからだとこういった取得方法は難しいのでしょうか?
guest

回答2

0

ベストアンサー

ライフサイクルの問題だと思いますが?

swift

1import UIKit 2 3class ViewController: UIViewController { 4 5 var str: String = "parent" 6 7 override func viewDidLoad() { 8 super.viewDidLoad() 9 print("ViewController/viewDidLoad") // ② 10 } 11} 12 13class subViewController: UIViewController { 14 15 override func viewDidLoad() { 16 super.viewDidLoad() 17 print("subVC/viewDidLoad: (String(describing: (parent as? ViewController)?.str))") 18 // ① => nil 19 } 20 21 override func viewWillAppear(_ animated: Bool) { 22 super.viewWillAppear(animated) 23 print("subVC/viewWillAppear: (String(describing: (parent as? ViewController)?.str))") 24 // ③ => parent 25 } 26 27 override func viewDidAppear(_ animated: Bool) { 28 super.viewDidAppear(animated) 29 print("subVC/viewDidAppear: (String(describing: (parent as? ViewController)?.str))") 30 // ④ => parent 31 } 32}

投稿2020/04/21 10:19

編集2020/04/21 10:25
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

Ka_ya_

2020/04/21 10:45

tyobigorouさん、たびたびすみません><。 本当にありがとうございます…!! 子ビューのviewDidLoadの方が先に呼ばれていたんですね! 文字列として受け取る方法まで丁寧に記載していただき、 お陰様で無事に値を取得する事が出来ました。 初心者の私でも分かりやすく説明していただき、凄く助かります。 本当にありがとうございました!
guest

0

ViewControllerが正しく取得できていないかもしれません。

以下のように親のViewControllerを取得してみてください。
https://qiita.com/tetsukick/items/ae05fdc6040c491639a2

投稿2020/04/21 08:32

編集2020/04/21 08:32
Tetsukick

総合スコア297

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

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

Ka_ya_

2020/04/21 09:11

リンクを貼っていただきありがとうございます。 サイトを参考に下記の様に記載してみましたが、 「Cannot call value of non-function type 'UIViewController?'」 というエラーが発生してしまいました。 勉強不足で処理内容が理解出来ておらずどこを直せば良いのか分からないのですが、 記載方法が間違っていますでしょうか。 class DetailViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() let parentVC = self.parentViewController() as? DetailScrollViewController print(parentVC) } } extension UIView { func parentViewController() -> UIViewController? { var parentResponder: UIResponder? = self while true { guard let nextResponder = parentResponder?.next else { return nil } if let viewController = nextResponder as? UIViewController { return viewController } parentResponder = nextResponder } } }
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問