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

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

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

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

Swift

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

Q&A

解決済

2回答

799閲覧

共通パーツ(xib,swift)をVIewControllerでUIViewで描画し制御する方法

yamayamak

総合スコア131

Xcode

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

Swift

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

0グッド

0クリップ

投稿2017/10/02 12:36

編集2017/10/03 00:12

似たような質問があるのですが、回答までたどり着けないので質問させてください。

共通パーツを作って、ViewControllerで制御したいのですができません。
ViewControllerにはUIViewを配置していて、そこに共通パーツのCustomViewを配置したいです。
現在、以下のようなコードを記載しています。

(1)共通パーツ「testView(xib,swift)」製作
・testView.xib作成
Xcodeにて、File->New->File->UserInterfaceよりViewを選択しUILabelを配置
・testView.swift作成
Xcodeにて、File->New->File->CocoaTouchClassのSubclassにUIViewで"testView"作成し以下のコードを記載
・XcodeにてtestView.xibのFile'sOwnerにtestViewを設定
・XcodeにてtestView.xibにUILabelを配置し、ドラッグドロップでtestView.swiftにIBOutletを設定

swift

1import UIKit 2class testView: UIView { 3 @IBOutlet weak var testLabel: UILabel! 4 // コードから生成された場合の初期化 5 override init(frame: CGRect){ 6 super.init(frame: frame) 7 loadNib() 8 } 9 // ストーリーボードから生成された場合の初期化 10 required init(coder aDecoder: NSCoder) { 11 super.init(coder: aDecoder)! 12 loadNib() 13 } 14 func loadNib(){ 15 // Xibのファイル名? 16 let view = Bundle.main.loadNibNamed("testView", owner: self, options: nil)?.first as! UIView 17 view.frame = self.bounds 18 self.addSubview(view) 19 } 20}

イメージ説明

(2)testMainViewController(ViewController)を作成し、以下に記述
Xcodeにて、File->New->File->CocoaTouchClassのSubclassにUIViewControllerで"testMainViewController"を作成し以下のコードを記載
・XcodeのStoryBoadにてViewControllerにclassにtestMainViewControllerを設定
UILabelを配置
・xcodeで配置したUILabelのclassにtestViewを設定
・XcodeのStoryBoadにてUILabelをドラッグドロップでtestMainViewController.swiftにIBOutletを設定[testViewParent]

swift

1import UIKit 2class testMainViewController: UIViewController { 3 @IBOutlet weak var testViewParent: testView! 4 override func viewDidLoad() { 5 super.viewDidLoad() 6 testViewChild = UINib(nibName: "testView", bundle: nil).instantiate(withOwner: self, options: nil).first as? testView 7 addSubviewWithAutoLayout(childView: testViewChild!, parentView: testViewParent) 8 } 9 // 親viewに対してフルで表示するためのautolayoutの制約 10 private func addSubviewWithAutoLayout(childView: UIView, parentView: UIView) { 11 parentView.addSubview(childView) 12 parentView.addConstraint(NSLayoutConstraint(item: childView, attribute: .top, relatedBy: .equal, toItem: parentView, attribute: .top, multiplier: 1.0, constant: 0)) 13 parentView.addConstraint(NSLayoutConstraint(item: childView, attribute: .right, relatedBy: .equal, toItem: parentView, attribute: .right, multiplier: 1.0, constant: 0)) 14 parentView.addConstraint(NSLayoutConstraint(item: childView, attribute: .bottom, relatedBy: .equal, toItem: parentView, attribute: .bottom, multiplier: 1.0, constant: 0)) 15 parentView.addConstraint(NSLayoutConstraint(item: childView, attribute: .left, relatedBy: .equal, toItem: parentView, attribute: .left, multiplier: 1.0, constant: 0)) 16 } 17 override func didReceiveMemoryWarning() { 18 super.didReceiveMemoryWarning() 19 } 20}

イメージ説明

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

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

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

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

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

Stripe

2017/10/02 13:57

それで、何が問題になっているんですか?
yamayamak

2017/10/02 14:06

以下のエラーが出ています。
yamayamak

2017/10/02 14:06

2017-10-02 23:04:46.902822+0900 myTest[1620:897738] *** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<myTest.testMainViewController 0x16e5cec0> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key testLabel.'
yamayamak

2017/10/02 14:09

あと、他にもいろいろ試して見たのですが、ダメでした。そもそも、書き方ややり方がどのようにするのが正しいのか?よくわからないので教えて欲しいです。UIViewにCustomViewを上書き見たいなやり方が正しいのでしょうか?
Stripe

2017/10/02 14:22

File'sOwnerが何だか知ってますか?
yamayamak

2017/10/02 14:36 編集

よくわからないので質問してますが、わかるなら直すポイントを記載していただけますか?
Stripe

2017/10/02 15:08

あなたの言う「共通パーツ」とは何ですか? プロジェクト内の複数の箇所で使い回すんですか?
guest

回答2

0

ベストアンサー

testViewの実装はだいたい良さそうです。
nibの読み込み自体はtestViewで十分できているので、tableViewのイニシャライザを使って生成してあげましょう。
コードで使う場合には、tableView(frame: CGRect.zero)とかで生成してあげるといいでしょう。
Storyboard上で使う場合には、配置したい箇所にUIViewを配置してクラスをtestViewに変えてあげるとtestView.init(coder aDecoder: NSCoder)経由で生成してくれます。
あとは、IBOutletでリンクしてあげれば実装したメソッドにもアクセスできます。
画像なしでわかりづらい説明ですがすみません・・・

投稿2017/10/02 15:41

yuutetu

総合スコア88

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

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

yamayamak

2017/10/02 23:59

回答ありがとうございます。すみません、どこをどのように修正すれば良いか、よくわからないのですが、「tableView(frame: CGRect.zero)」は、testMainViewController内に記載するというだと思いますが、どのように記載すれば良いでしょうか? また、IBOutletでリンクしてあげれば実装したメソッドにもアクセスというのはメソッドを記載した場合のことでしょうか?IBOutletでリンクはしているつもりですが、まだ不足があるのでしょうか?
yamayamak

2017/10/03 00:09

ありがとうございます。動きました。修正したコードは別途以下に記載しましたので、コメントがあればお願いします。
yuutetu

2017/10/03 00:14

動作したようで、良かったです。
guest

0

testMainViewControllerを以下のように記載して動きました。

swift

1import UIKit 2class testMainViewController: UIViewController { 3 @IBOutlet weak var testViewParent: testView! 4 override func viewDidLoad() { 5 super.viewDidLoad() 6 //testViewParent = testView(frame: CGRect.zero) 7 } 8 override func didReceiveMemoryWarning() { 9 super.didReceiveMemoryWarning() 10 } 11}

投稿2017/10/03 00:13

編集2017/10/03 00:39
yamayamak

総合スコア131

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

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

yuutetu

2017/10/03 00:22

`@IBOutlet weak var testViewParent: testView!`の行だけで十分な気がします。 `func viewDidLoad()`の処理を無くしても動くと思います。 (このコードだと2回カスタムビューの再生が発生していそうです。)
yamayamak

2017/10/03 00:40

なるほど、ありがとうございます。 ご指摘の内容で動作するのを確認し回答を修正しました。 不要な行をコメントアウトしました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問