2017-02-13 3 views
0

Ich habe mehrere Navigations-Controller und ihre Root-View-Controller in meiner App. Ich möchte, dass jede Navigationsleiste Schaltflächen für soziale Medien enthält, die sich auf der rechten Seite der Leiste befinden. Für das gleiche habe ich diesen Code zu erhalten, die Tasten in 1 View-Controller verwendet:Ersetze wiederholten Code 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) 

Jetzt habe ich die gleichen Tasten auf allen Navigationsleisten will. Ich kann diesen Code und die entsprechenden Zielmethoden einfach in viewDidLoad() jedes View-Controllers kopieren, aber zu viel Code wird wiederholt. Wie kann man diese Situation vermeiden?

Ich benutze Swift 3. Ich bin neu in iOS. Jede Hilfe wird geschätzt!

+0

Sie könnten eine gemeinsame "Eltern" von Ihrem UIViewController gesetzt, wie „CommonViewController ", fügen Sie diesen Code ein und jeder Ihrer ViewController erbt von CommonViewController. – Larme

Antwort

1

meisten Vervielfältigungen werden durch die Verwendung Funktionen gelöst. Der erste Schritt besteht darin, diesen Code in eine Funktion zu extrahieren. Der zweite Schritt besteht darin, dieselbe Funktion von mehreren Stellen aus zu verwenden.

Sie können es zu einer Erweiterung hinzufügen, zum Beispiel:

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

und rufen nur

self.addShareButtons() 

von jedem Controller, der die Tasten benötigt.

Sie können der Erweiterung auch Schaltflächenhandler hinzufügen. Eine andere Methode ist die Verwendung einer UIViewController Unterklasse, aber das ist immer ein Problem, wenn Sie eine UITableViewController Unterklasse verwenden möchten.

0

Sie können einen benutzerdefinierten Navigationscontroller erstellen und diesen Code zum Navigationscontroller hinzufügen. erben Sie den Navigationscontroller zu Ihrem Storyboard oder programmatisch, wo Sie verwenden möchten.

// Beispielcode

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

Unter der Annahme, dass diese Schaltflächen IMMER dasselbe Verhalten haben, können Sie eine benutzerdefinierte Klasse für sie erstellen und den wiederholten Code dort platzieren. Zum Beispiel:

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) 
    } 
} 

... Ich denke, der Compiler bei Ihnen zur Initialisierung eines UIView ohne Decoder und Rahmen schreit, aber hoffentlich bekommen Sie die Idee.

dies zu verbessern, können Sie 1) einen benutzerdefinierten UINavigationController mit dem UIBarButtonItems schaffen könnten Sie verwenden mögen, und dass die Steuerung wieder verwenden und/oder 2) ein Protokoll wie folgt erstellen:

protocol FacebookBtnHandler { 
    func fbBtnPressed() 
} 

. ..und haben alle relevanten VCs entsprechen. Dadurch können Sie das Ziel und den Selektor für die Schaltfläche in der FacebookButton-Methode init zuweisen, wobei Sie das Bild und den Rahmen zuweisen und somit die Wiederholung dieser Linie verhindern.

0

Try bar Taste implementieren von der Unterklasse von 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) 

und machen es für alle View-Controller zu schaffen

extension UIViewController { 
    func addButtons() { 
     // add above code 
    } 
}