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

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

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

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

Q&A

解決済

1回答

290閲覧

Controllerとviewの分離について

hodoru3sei

総合スコア284

Swift

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

0グッド

0クリップ

投稿2018/11/01 14:18

ViewControllerに今までベタ書きしてしまっていたので、viewを別クラスに分離しようと考えました。
ボタンやテキストの中身の設定の処理を分離してみました。

迷っているところですが、addTargetの部分です。
今まではViewControllerの中でButtonなどのViewを関数で定義していて、関数内にaddTargetも含めていたのですが、画面遷移を行なっているものなどをしているものもあり、どうすれば良いのかわからなくなってしまいました。

良い解決方法があれば教えてください、根本的に私のやり方が間違っている場合は参考になるURLなど教えていただけたら嬉しいです。

UIの設定を詰め込んだクラス

Swift

1 2class UIParts: NSObject { 3 static func taskButton(view: UIViewController, color: UIColor)->UIButton{ 4 let button = UIButton() 5 button.layer.masksToBounds = true 6 button.layer.cornerRadius = 50.0 7 button.frame = CGRect(x:0,y:0,width:view.view.frame.width/4,height:view.view.frame.width/4) 8 button.backgroundColor = color 9 button.layer.position = CGPoint(x: view.view.frame.midX, y: view.view.frame.height - view.view.frame.midY) 10 button.setTitle("タスク", for: UIControlState.normal) 11 return button 12 } 13 14 static func rainButton(this view: UIViewController)->UIButton{ 15 let button = UIButton() 16 let image :UIImage? = UIImage(named:"croudy") 17 button.frame = CGRect(x:0,y:0,width:view.view.frame.width/2,height:view.view.frame.width/6) 18 button.layer.masksToBounds = true 19 button.layer.position = CGPoint(x: view.view.frame.midX, y: view.view.frame.height/13) 20 button.setImage(image, for: .normal) 21 button.translatesAutoresizingMaskIntoConstraints = false 22 return button 23 } 24 static func reloadButton(this view:UIViewController)->UIButton{ 25 let button = UIButton() 26 let image :UIImage? = UIImage(named:"reload") 27 button.frame = CGRect(x:0,y:0,width:view.view.frame.width/6,height:view.view.frame.width/6) 28 button.layer.masksToBounds = true 29 button.layer.cornerRadius = 20.0 30 button.layer.position = CGPoint(x: view.view.frame.width/10, y: view.view.frame.height/13) 31 button.setImage(image, for: .normal) 32 return button 33 } 34 static func addButton(this view: UIViewController)->UIButton{ 35 let image :UIImage? = UIImage(named:"add") 36 let button = UIButton() 37 button.frame = CGRect(x:0,y:0,width:view.view.frame.width/6,height:view.view.frame.width/6) 38 button.layer.masksToBounds = true 39 button.layer.cornerRadius = 20.0 40 button.layer.position = CGPoint(x: view.view.frame.width - view.view.frame.width/10, y: view.view.frame.height/13) 41 button.setImage(image, for: .normal) 42 return button 43 } 44 static func toDoText(this view: UIViewController, title: String)->UITextView{ 45 let textView = UITextView() 46 textView.frame = CGRect(x:view.view.frame.width/5, y:30, width:view.view.frame.width - view.view.frame.width/5, height:60) 47 textView.layer.position = CGPoint(x: view.view.frame.width/2, y: view.view.frame.height - view.view.frame.height/7) 48 textView.text = title 49 textView.font = UIFont.systemFont(ofSize: 20.0) 50 textView.layer.borderWidth = 1 51 textView.isEditable = true 52 return textView 53 } 54}

呼び出し元

Swift

1//雨ボボタン 2 self.rainButton = UIParts.rainButton(this: self) 3 self.rainButton.addTarget(self, action: 4 #selector(self.startApplication), for: .touchUpInside) 5 self.view.addSubview(self.rainButton) 6 //リロードボタン 7 self.reloadButton = UIParts.reloadButton(this: self) 8 self.reloadButton.addTarget(self, action: 9 #selector(self.reload(sender:)), for: .touchUpInside) 10 self.view.addSubview(self.reloadButton) 11 //タスク追加ボタン 12 self.addButton = UIParts.addButton(this: self) 13 self.addButton.addTarget(self, action: 14 #selector(self.addTask(sender:)), for: .touchUpInside) 15 self.view.addSubview(self.addButton)

コードはざっとですが、このような形になっています。

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

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

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

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

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

takabosoft

2018/11/02 00:47

迷っているとは書いてありますが、何と何で迷っているかが書いてありませんので回答のしようがありません。
guest

回答1

0

ベストアンサー

悩み始めると終わらないので妥協も必要です
調べても多分解決しないと思います、世にある様々なデザインパターンは意外とこの小さな問題を解決しません

考えるべきは「そのパーツの情報は誰が知っているべきか」ですが
おそらく今回はViewController=画面が知っているべきではないでしょうか
それならば、classではなくViewController内にインスタンスメソッドとして定義すれば解決します(static funcではなくfunc)

ちなみに私が作るならstoryboardからIBOutletでbuttonを引っ張ってきて
setupButtonsDesign()という関数を定義してviewDidLayoutで呼びます

投稿2018/11/02 02:07

kosanai

総合スコア471

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問