2017-03-27 6 views
0

私は自分のプロジェクトのすべてのボタンの外観を制御しようとしています。 Extensionを作成してViewControllerファイルの先頭に置いて、そのビュー内のすべてのボタンの外観を制御します。それは素晴らしい作品です。ここにあります:ボタンの外観をグローバルに制御する

import UIKit 

    // EXTENSION TO CONTROL BUTTON APPEARANCE 
    extension UIButton { 
     func styleButton() { 
      self.layer.cornerRadius = 8 
      self.layer.borderWidth = 2 
      self.layer.borderColor = UIColor.red.cgColor 
     } 
    } 

    class DefaultSettingsVC: UIViewController, UITextFieldDelegate { 
    ... 
    // IN VIEWDIDLOAD : 
     myButton1.styleButton() 
     myButton2.styleButton() //etc. 

唯一のことは、すべてのViewControllerファイルの先頭に置く必要があることです。 (私はここで適切な用語を使用したいと思っています。)そうではなく、私はUIButtonのサブクラスである全く新しいファイルを作成すると考えました。これはファイル全体の内容です:

import UIKit 

class ButtonStyle: UIButton { 
    func styleButton() { 
     self.layer.cornerRadius = 8 
     self.layer.borderWidth = 2 
     self.layer.borderColor = UIColor.red.cgColor 
    } 
} 

しかし、今何がありますか? ViewControllerファイルのClass行に追加しようとすると、「クラスから複数の継承」エラーが発生します。

class DefaultSettingsVC: UIViewController, UITextFieldDelegate, ButtonStyle { 

私は完全に間違ったトラックにいますか?私はこれをまったく別のやり方で行うべきですか?どんな助けも素晴らしいだろう。私のスウィフトの専門知識は5分の2.5にすぎないので、私はまだ学んでいますし、可能であれば、いくつかの指導に感謝するでしょう。

+0

'styleButton()'が暗黙的に適用されるべきサブクラスを作成したいということは何ですか? –

+0

そうだと思います。しかし、それが正しい方法であるかどうかはわかりません。 – Jupiter869

+0

あなたの質問に答える前に、何を達成しようとしているのかがまさに目的だと言えますか?私は有用なアプローチを提案することができます。 –

答えて

2

これを行うには、サブクラスを使用しないでください。拡張機能は、行く方法です!拡張機能を別のクラスで使用できるようにするには、それを別々のファイルに入れてください。 UIButtonクラスを拡張しているので、どこからでもアクセスできます。

を参照してください、ViewControllerクラス:

class MyViewController: UIViewController { 

    var button = UIButton() 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     button.styleButton(cornerRadius: 8, borderWidth: 2, borderColor: UIColor.red.cgColor) 
    } 
} 

そして、あなたの拡張機能ファイル:

extension UIButton { 
    func styleButton(cornerRadius: CGFloat, borderWidth: CGFloat, borderColor: CGColor) { 
     self.layer.cornerRadius = cornerRadius 
     self.layer.borderWidth = borderWidth 
     self.layer.borderColor = borderColor 
    } 
} 

は、私はあなたがケースにしたいパラメータを設定することができるしているので、今それを少し微調整します後でいくつかのボタンのスタイルを変更する必要があります。それは私の意見では、より再利用可能なので、より有用です。

+0

これは素晴らしく機能します!どうもありがとうございました! (私は、私のViewControllerファイルのどこかにあるボタン拡張ファイルを特定する必要はありませんが、驚いています。 – Jupiter869

+0

あなたは大歓迎です!それは拡張機能にとって素晴らしいことです。あなたが 'UIKit'の' UIButton'クラスを拡張しているので、あなたが 'UIButton'を作るたびに、拡張機能のメソッドと変数を利用できます。 – raphh

0

私は、すべてのViewControllers内のすべてのボタンのための所望のスタイルを適用することをお勧め:

  • アプリケーション内のViewControllersのすべてのカスタムUIViewControllerスーパークラスを作成します。

  • スーパークラスは、ビュー内のすべてのボタンに対して目的のスタイルの適用を処理させます。

スーパークラスは、のようになります。

class BaseViewController: UIViewController { 
    override func viewDidLoad() { 
     super.viewDidLoad() 

     setupButtonsStyle() 
    } 

    func setupButtonsStyle() { 
     for subview in view.allSubViews.filter({$0 is UIButton}) { 
      let button = subview as! UIButton 
      button.layer.cornerRadius = 8 
      button.layer.borderWidth = 2 
      button.layer.borderColor = UIColor.red.cgColor 
     } 
    } 
} 

extension UIView { 
    var allSubViews : [UIView] { 
     var array = [self.subviews].flatMap {$0} 
     array.forEach { array.append(contentsOf: $0.allSubViews) } 

     return array 
    } 
} 

allSubViews宣言の目的は、ビュー内のすべてのビューとそのサブビューを取得することです。

サブクラス(ES)viewDidLoad()方法はsuper.viewDidLoad()が含まれていることを確認してください:

class ViewController: BaseViewController { 
    override func viewDidLoad() { 
     super.viewDidLoad() 
    } 
} 

このアプローチは、アプリケーション内の各単一のボタンのスタイルメソッドを呼び出すの時間を節約できます(あなたが呼び出す必要はありません。ボタンごとに手動でbutton.styleButtonを実行する)、目的のViewControllerをスーパークラスのサブクラスにするだけです。

これが役に立った。

+0

ありがとうございます!これは非常に素晴らしい解決策です。私は各ボタンのスタイルを呼び出す必要はないのが好きです。ありがとう!! :) – Jupiter869

関連する問題