2017-02-13 18 views
0

私のアプリには、複数のナビゲーションコントローラとそのルートビューコントローラがあります。私は各ナビゲーションバーに、ソーシャルメディアのボタンをバーの右側に密接に配置させたいと思っています。同じ場合、このコードを使用して1つのビューコントローラーのボタンを表示しています:繰り返しコードを削除するSwift 3

let fbImage = UIImage(named: "Facebook.png")! 
    let twitterImage = UIImage(named: "Twitter.png")! 
    let youtbImage = UIImage(named:"YouTube.png")! 

    let fbBtn: UIButton = UIButton(type: .custom) 
    fbBtn.setImage(fbImage, for: UIControlState.normal) 
    fbBtn.addTarget(self, action: #selector(HomeViewController.fbBtnPressed), for: UIControlEvents.touchUpInside) 
    fbBtn.frame = CGRect(x: 0, y: 0, width: 30, height: 30) 
    let fbBarBtn = UIBarButtonItem(customView: fbBtn) 

    let twitterBtn: UIButton = UIButton(type: .custom) 
    twitterBtn.setImage(twitterImage, for: UIControlState.normal) 
    twitterBtn.addTarget(self, action: #selector(HomeViewController.twitterBtnPressed), for: UIControlEvents.touchUpInside) 
    twitterBtn.frame = CGRect(x: 0, y: 0, width: 30, height: 30) 
    let twitterBarBtn = UIBarButtonItem(customView: twitterBtn) 

    let youtbBtn: UIButton = UIButton(type: .custom) 
    youtbBtn.setImage(youtbImage, for: UIControlState.normal) 
    youtbBtn.addTarget(self, action: #selector(HomeViewController.youtubeBtnPressed), for: UIControlEvents.touchUpInside) 
    youtbBtn.frame = CGRect(x: 0, y: 0, width: 30, height: 30) 
    let youtbBarBtn = UIBarButtonItem(customView: youtbBtn) 

    self.navigationItem.setRightBarButtonItems([youtbBarBtn, twitterBarBtn, fbBarBtn], animated: false) 

すべてのナビゲーションバーに同じボタンが必要です。このコードと各ターゲットメソッドをそれぞれのビューコントローラのviewDidLoad()に簡単にコピーできますが、コードが多すぎます。だからこのような状況を避ける方法はありますか?

私はSwift 3を使用しています。私はiOSを初めて使用しています。どんな助けもありがとう!

+0

のためにそれを作ってみますそのコードをその中に入れ、それぞれのViewControllerはCommonViewControllerから継承します。 – Larme

答えて

1

ほとんど重複が機能を使用することによって解決されます。最初のステップは、そのコードを関数に抽出することです。第2のステップは、複数の場所から同じ関数を使用することです。

extension UIViewController { 
    func addShareButtons() { 
     ... 
     self.navigationItem.setRightBarButtonItems([youtbBarBtn, twitterBarBtn, fbBarBtn], animated: false) 
    } 
} 

をし、ボタンのみを必要とするすべてのコントローラから

self.addShareButtons() 

を呼び出す:

次の例のように、拡張子に追加することができます。

ボタンハンドラを拡張機能に追加することもできます。

もう1つの方法はUIViewControllerサブクラスを使用することですが、UITableViewControllerサブクラスを使用する場合は常に問題になります。

0

カスタムナビゲーションコントローラを設計し、これらのコードをナビゲーションコントローラに追加することができます。ストーリーボードにナビゲーションコントローラを継承するか、プログラムで使用する場所を継承します。

//サンプルコード

class "YourNavigationCorollerName": UINavigationController, UINavigationControllerDelegate { 
    override func viewDidLoad() { 
    super.viewDidLoad() 
     //declare here you code, what you want 
    } 
} 
0

これらのボタンは常に同じ動作をすると仮定して、カスタムクラスを作成してそこに繰り返しコードを配置することができます。例えば:

class FacebookButton : UIButton { 

    override init() { 

     super.init() 
     self.frame = CGRect(x: 0, y: 0, width: 30, height: 30) 
     self.setImage(UIImage(named: "Facebook.png")!, for: .normal) 
    } 
} 

...私は、コンパイラは、デコーダとフレームなしのUIViewを初期化するためにあなたに叫ぶだろうと思うが、うまくいけばあなたのアイデアを得ます。

あなたは1)あなたが使用したいUIBarButtonItemsでカスタムUINavigationControllerを作成することができ、これを改善し、及びそのコントローラを再利用、および/または2)以下のようなプロトコルを作成するには、次の

protocol FacebookBtnHandler { 
    func fbBtnPressed() 
} 

。そして、関連するVCがそれに従うようにしてください。これにより、画像とフレームを割り当てたFacebookButtonのinitメソッドのボタンのターゲットとセレクタを割り当てることができ、そのラインの繰り返しも防ぐことができます。

0

UIBarButton

class Button: UIBarButtonItem { 
    convenience init(withImage image : UIImage,Target target: Any, andSelector selector: Any?){ 

     let button = UIButton(type: .custom) 
     button.setImage(image, for: UIControlState.normal) 
     button.frame = CGRect(x: 0, y: 0, width: 30, height: 30) 
     button.addTarget(target, action: selector, for: UIControlEvents.touchUpInside) 

     self.init(customView: button) 
    } 
} 


let fbImage = UIImage(named: "Facebook.png")! 
let twitterImage = UIImage(named: "Twitter.png")! 
let youtbImage = UIImage(named:"YouTube.png")! 

let fbBtn = Button(withImage: fbImage, Target: self, andSelector: #selector(HomeViewController.fbBtnPressed)) 

let twitterBtn = Button(withImage: fbImage, Target: self, andSelector: #selector(HomeViewController.twitterBtnPressed)) 

let youtubeBtn = Button(withImage: fbImage, Target: self, andSelector: #selector(HomeViewController.youtubeBtnPressed)) 

self.navigationItem.setRightBarButtonItems([youtbBarBtn, twitterBarBtn, fbBarBtn], animated: false) 

のサブクラスを作成することにより、バーのボタンを実装し、あなたがCommonViewController」のように、あなたのUIViewControllerから、共通の「親」を設定することができ、すべてのビューコントローラ

extension UIViewController { 
    func addButtons() { 
     // add above code 
    } 
} 
関連する問題