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

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

837閲覧

ViewControllerからViewに値を渡して、xibに値を表示させたい

masamasamasa

総合スコア95

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/06/26 10:11

編集2019/06/26 10:39

##やりたいこと
ViewControllerからViewに値を渡して、xibに値を表示させたい
(tableViewの中にViewをヘッダーとして入れています。このViewのことを話します)
イメージ説明

##詳細
ViewController

Swift

1class NotesViewController: UIViewController { 2 3 @IBOutlet weak var tableView: UITableView! 4 5 override func viewDidLoad() { 6 super.viewDidLoad() 7 8 tableView.dataSource = self 9 tableView.delegate = self 10 // xibを使用 11 tableView.register(UINib(nibName: "NoteTableViewCell", bundle: nil), forCellReuseIdentifier: "NoteTableViewCell") 12 13 setupNav() 14 } 15 16 func setupNav() { 17 Api.ApiClass.fetchClass(classId: classId) { (c) in 18 let category = CategoryView() 19 category.category = c // ここでViewに値を渡している 20 } 21 } 22}

View

Swift

1class CategoryView: UIView { 2 3 @IBOutlet weak var cLabel: UILabel! 4 5 override init(frame: CGRect){ super.init(frame: frame); loadNib() } 6 required init(coder aDecoder: NSCoder) { super.init(coder: aDecoder)!; loadNib() } 7 func loadNib(){ 8 let view = Bundle.main.loadNibNamed("CategoryView", owner: self, options: nil)?.first as! UIView 9 view.frame = self.bounds 10 self.addSubview(view) 11 } 12 13 // ViewControllerからここで値をキャッチ 14 var category: Class? { 15 didSet { 16 updateView() 17 } 18 } 19 20 func updateView() { 21     // xibからつなげたIBOutletに値を入れているが、これが表示されない 22 cLabel.text = category?.title 23 } 24}

##問題
xibはしっかり表示されるのですが、入れた値が表示されない

どうしたら良いでしょうか?
すみませんが、よろしくお願いします。

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

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

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

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

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

hayabusabusash

2019/06/26 10:31 編集

TableViewに表示するならCategoryViewをUITableViewCellで作るのはどうでしょうか? 参考(https://yuu.1000quu.com/use_a_custom_cell_in_swift) もしUIViewで作らないといけない理由があるならまた別のアプローチになるかもしれませんが...
masamasamasa

2019/06/26 10:35

すいません。書き忘れていました。 tableViewの中にViewを入れて、ヘッダーを作りました。このViewのお話になります。 情報が足りなくてすみません。 修正します。
hayabusabusash

2019/06/26 10:50

修正ありがとうございます! なるほど、ヘッダーがカスタムのViewになっているんですね。 質問ですが、Storyboard上にあるCategoryViewをNotesViewControllerにOutlet接続はされていますか?
masamasamasa

2019/06/26 11:10 編集

ご返信ありがとうございます。 Storyboard上からは接続してないですね。 接続してあるのは、CategoryViewからxibだけになります。
hayabusabusash

2019/06/26 11:23

Outlet接続してCategoryView内のcategoryに新しい値を代入することができたので、 fetchのクロージャー内で接続したCategoryViewのcategoryに新しい値をセットするのはどうでしょうか? ただ同じようにやってみてもCategoryViewが全然表示されなくて... ちょっと回答には程遠い感じになっています... これってCategoryViewの高さ等はどこかで指定している感じですか?
masamasamasa

2019/06/26 11:31

ご返信ありがとうございます。 「fetchのクロージャー内で接続したCategoryViewのcategoryに新しい値をセットする」 -> 質問内容ができなければ、これをやる予定でした。ただ、こうするとViewControllerの行数が増えてしまうのでもうちょっと頑張りたいです。 CategoryViewの高さは、xibのsizeをFreeFormにして、heightで設定しています。
hayabusabusash

2019/06/26 11:48 編集

すみません。 こちらがきちんと意図を汲み取れていないので的外れかもしれませんが、 以下のようにするのは何か問題があるのでしょうか? これならそこまでコードの量は変わらないと思います。 class NotesViewController: UIViewController { @IBOutlet weak var tableView: UITableView! @IBOutlet weak var categoryView: CategoryView! // StoryboardからOutlet接続 override func viewDidLoad() { super.viewDidLoad() tableView.dataSource = self tableView.delegate = self // xibを使用 tableView.register(UINib(nibName: "NoteTableViewCell", bundle: nil), forCellReuseIdentifier: "NoteTableViewCell") setupNav() } func setupNav() { Api.ApiClass.fetchClass(classId: classId) { (c) in self.categoryView.category = c } } }
masamasamasa

2019/06/26 11:55

す、すごいです。できました!ありがとうございます! 初心者なので、なぜこれができるのかがまったくわかってないのですが、、、 よかったらなぜできなくて、なぜできたのかを教えていただけたら幸いです。 本当にありがとうございましす!
masamasamasa

2019/06/26 11:57

あとぜひベストアンサーに選ばせていただきたいので、回答として書いていただきたいです。 よろしくお願いいたします。
hayabusabusash

2019/06/26 12:10 編集

よかったです!! 単にNotesViewControllerに表示されているCategoryViewを更新するようにしただけです。 fetchのクロージャー内の処理ですが let category = CategoryView() category.category = c // ここでViewに値を渡している となっています。 これでは新しくCategoryViewを生成してそれに対して値を渡してしまっているので、 NotesViewController上に表示されているCategoryViewが更新されることはありません。 なのでStoryboardからCategoryViewをOutlet接続して、 それをfetch内で値を渡すようにすれば、表示されているCategoryViewに対して更新をかけることができます。 Storyboardで生成したViewなどに対してコードから参照する場合はOutlet接続しないとダメですからね。 もしTableViewのヘッダーがつくりたいならTableViewのSectionHeaderにCategoryViewを指定してしまうのもありなんじゃないかなと思います! (https://qiita.com/ryokosuge/items/3dabb9875b32a0908bce) こんな感じでよければ自己解決でこの質問を解決済みにしておいてください!
masamasamasa

2019/06/26 12:15

解説もすごいわかりやすくて助かりました。 貴重なお時間を使っていただき本当にありがとうございました!
guest

回答2

0

hayabusabusashさんのアドバイスにより解決しました。

Swift

1class NotesViewController: UIViewController { 2 3@IBOutlet weak var tableView: UITableView! 4@IBOutlet weak var categoryView: CategoryView! // StoryboardからOutlet接続 5 6override func viewDidLoad() { 7 super.viewDidLoad() 8 9 tableView.dataSource = self 10 tableView.delegate = self 11 // xibを使用 12 tableView.register(UINib(nibName: "NoteTableViewCell", bundle: nil), 13 forCellReuseIdentifier: "NoteTableViewCell") 14 15setupNav() 16} 17 18func setupNav() { 19 Api.ApiClass.fetchClass(classId: classId) { (c) in 20 self.categoryView.category = c 21} 22} 23}

理由
ーーーーーー
単にNotesViewControllerに表示されているCategoryViewを更新するようにしただけです。
fetchのクロージャー内の処理ですが

let category = CategoryView()
category.category = c // ここでViewに値を渡している

となっています。
これでは新しくCategoryViewを生成してそれに対して値を渡してしまっているので、
NotesViewController上に表示されているCategoryViewが更新されることはありません。

なのでStoryboardからCategoryViewをOutlet接続して、
それをfetch内で値を渡すようにすれば、表示されているCategoryViewに対して更新をかけることができます。
Storyboardで生成したViewなどに対してコードから参照する場合はOutlet接続しないとダメですからね。

もしTableViewのヘッダーがつくりたいならTableViewのSectionHeaderにCategoryViewを指定してしまうのもありなんじゃないかなと思います!
(https://qiita.com/ryokosuge/items/3dabb9875b32a0908bce)
ーーーーーー

本当に助かりました。
ありがとうございました(^ ^)

投稿2019/06/26 12:21

masamasamasa

総合スコア95

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

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

0

ベストアンサー

Outlet接続されていないので、
CategoryViewをNotesViewControllerに接続して更新するようにしました。

Swift

1class NotesViewController: UIViewController { 2 3@IBOutlet weak var tableView: UITableView! 4@IBOutlet weak var categoryView: CategoryView! // StoryboardからOutlet接続 5 6override func viewDidLoad() { 7super.viewDidLoad() 8 9tableView.dataSource = self 10tableView.delegate = self 11// xibを使用 12tableView.register(UINib(nibName: "NoteTableViewCell", bundle: nil), forCellReuseIdentifier: "NoteTableViewCell") 13 14setupNav() 15} 16 17func setupNav() { 18Api.ApiClass.fetchClass(classId: classId) { (c) in 19self.categoryView.category = c 20} 21} 22}

投稿2019/06/26 12:20

hayabusabusash

総合スコア767

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

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

masamasamasa

2019/06/26 12:24

自己解決を書くのに時間がかかってしました。 ご回答ありがとうございます。 ベストアンサーにさせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問