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

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

ただいまの
回答率

90.51%

  • Swift

    8743questions

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

Controllerとviewの分離について

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 193

hodoru3sei

score 63

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

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

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

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

class UIParts: NSObject {
    static func taskButton(view: UIViewController, color: UIColor)->UIButton{
        let button = UIButton()
        button.layer.masksToBounds = true
        button.layer.cornerRadius = 50.0
        button.frame = CGRect(x:0,y:0,width:view.view.frame.width/4,height:view.view.frame.width/4)
        button.backgroundColor = color
        button.layer.position = CGPoint(x: view.view.frame.midX, y: view.view.frame.height - view.view.frame.midY)
        button.setTitle("タスク", for: UIControlState.normal)
        return button
    }

    static func rainButton(this view: UIViewController)->UIButton{
        let button = UIButton()
        let image :UIImage? = UIImage(named:"croudy")
        button.frame = CGRect(x:0,y:0,width:view.view.frame.width/2,height:view.view.frame.width/6)
        button.layer.masksToBounds = true
        button.layer.position = CGPoint(x: view.view.frame.midX, y: view.view.frame.height/13)
        button.setImage(image, for: .normal)
        button.translatesAutoresizingMaskIntoConstraints = false
        return button
    }
    static func reloadButton(this view:UIViewController)->UIButton{
        let button = UIButton()
        let image :UIImage? = UIImage(named:"reload")
        button.frame = CGRect(x:0,y:0,width:view.view.frame.width/6,height:view.view.frame.width/6)
        button.layer.masksToBounds = true
        button.layer.cornerRadius = 20.0
        button.layer.position = CGPoint(x: view.view.frame.width/10, y: view.view.frame.height/13)
        button.setImage(image, for: .normal)
        return button
    }
    static func addButton(this view: UIViewController)->UIButton{
        let image :UIImage? = UIImage(named:"add")
        let button = UIButton()
        button.frame = CGRect(x:0,y:0,width:view.view.frame.width/6,height:view.view.frame.width/6)
        button.layer.masksToBounds = true
        button.layer.cornerRadius = 20.0
        button.layer.position = CGPoint(x: view.view.frame.width - view.view.frame.width/10, y: view.view.frame.height/13)
        button.setImage(image, for: .normal)
        return button
    }
    static func toDoText(this view: UIViewController, title: String)->UITextView{
        let textView = UITextView()
        textView.frame = CGRect(x:view.view.frame.width/5, y:30, width:view.view.frame.width - view.view.frame.width/5, height:60)
        textView.layer.position = CGPoint(x: view.view.frame.width/2, y: view.view.frame.height - view.view.frame.height/7)
        textView.text = title
        textView.font = UIFont.systemFont(ofSize: 20.0)
        textView.layer.borderWidth = 1
        textView.isEditable = true
        return textView
    }
}

 呼び出し元

//雨ボボタン
            self.rainButton = UIParts.rainButton(this: self)
            self.rainButton.addTarget(self, action:
                                    #selector(self.startApplication), for: .touchUpInside)
            self.view.addSubview(self.rainButton)
            //リロードボタン
            self.reloadButton = UIParts.reloadButton(this: self)
            self.reloadButton.addTarget(self, action:
                    #selector(self.reload(sender:)), for: .touchUpInside)
            self.view.addSubview(self.reloadButton)
            //タスク追加ボタン
            self.addButton = UIParts.addButton(this: self)
            self.addButton.addTarget(self, action:
                    #selector(self.addTask(sender:)), for: .touchUpInside)
            self.view.addSubview(self.addButton)

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • takabosoft

    2018/11/02 09:47

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

    キャンセル

回答 1

checkベストアンサー

+1

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

同じタグがついた質問を見る

  • Swift

    8743questions

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