2017-07-16 5 views
0

Ich habe ein BarButtonItem, das ich jedem ViewController in meiner App hinzufügen möchte. Wie kann ich dies tun, ohne den Button-Erstellungscode und die Aktionsfunktion in jeden ViewController kopieren zu müssen? Ich würde die Wiederverwendbarkeit bevorzugen, anstatt den gleichen Code in jedem ViewController zu haben.Swift 3 - Hinzufügen von BarButtonItem zur Navigationsleiste auf jedem ViewController ohne Code zu wiederholen

Button-Code:

// Settings button 
    let btn = UIButton(type: .custom) 
    btn.setImage(UIImage(named: "icon-settings"), for: .normal) 
    btn.frame = CGRect(x: 0, y: 0, width: 30, height: 30) 
    btn.addTarget(self, action: #selector(showSettings(sender:)), for: .touchUpInside) 
    let settingsBtn = UIBarButtonItem(customView: btn) 
    self.navigationItem.setRightBarButton(settingsBtn, animated: false) 

Die Aktion:

let storyboard = UIStoryboard(name: "Main", bundle: nil) 
    let vc = storyboard.instantiateViewController(withIdentifier: "SettingsVC") as! SettingsViewController 
    self.navigationController?.show(vc, sender: self) 

Ich habe versucht, diesen Code in einer separaten Utility-Klasse hinzufügen, aber Sie können den Übergang von nicht durchführen, da es Es gibt keine Möglichkeit, über die Action-Funktion auf den übergeordnete ViewController der Schaltfläche zuzugreifen, wenn dies in der Utility-Klasse deklariert ist. Ich habe auch versucht, UINavigationController abzuleiten und diese Unterklasse dem NavigationController in meinem Storyboard zuzuordnen, aber es hat nicht funktioniert.

+1

Sie müssen Unterklasse 'UIViewController' und haben Sie jede Ihrer View-Controller Unterklasse * das * Unterklasse – Paulw11

Antwort

1

Sie können dies tun, indem Sie eine BaseViewController hinzufügen und den Code dort einfügen. Danach erweitern Sie auf Ihrem rootviewController von NavigationController einfach diese BaseViewController. Wenn Sie das tun und super in dieser Funktion aufrufen, wird immer dieser Code verfügbar sein und Sie müssen nicht in jedem Viewcontroller wiederholen.

import UIKit 

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

     // Settings button 
     let btn = UIButton(type: .custom) 
     btn.setImage(UIImage(named: "icon-settings"), for: .normal) 
     btn.frame = CGRect(x: 0, y: 0, width: 30, height: 30) 
     btn.addTarget(self, action: #selector(showSettings(sender:)), for: .touchUpInside) 
     let settingsBtn = UIBarButtonItem(customView: btn) 
     self.navigationItem.setRightBarButton(settingsBtn, animated: false) 
    } 

    override func viewWillAppear(_ animated: Bool) { 
     super.viewWillAppear(animated) 
    } 

Und dann in Ihrem View-Controller erweitern Sie nur BaseViewController

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

     //Button should already appear here 
    } 

Beachten Sie, dass Viewcontroller Ihr Root-View-Controller sein sollte.

+0

Das ist eine großartige Idee, ich werde es überprüfen, denn ich genehmige, vielen Dank! –

Verwandte Themen