2016-10-17 5 views
0

Ich habe die folgende Anpassung an meinen integrierten UINavigationcontroller vorgenommen. Ich habe dies im View-Controller der Ansicht getan, der als erster angezeigt wird.Erstellen Sie eine benutzerdefinierte UINavigationcontrollerklasse

Allerdings versuche ich es zu bereinigen, so dass ich dies alles nicht in meiner UIView-Klasse habe, indem ich eine separate Klasse erstelle, die sich darum kümmert. Der Code, den ich zur Zeit bin mit

self.navigationController?.navigationBar.setBackgroundImage(UIImage(named: "navigation.background"), for: .default) 

let backButton = UIImage(named: "Back.button")?.withRenderingMode(.alwaysOriginal) 
let backButtonHigh = UIImage(named: "Back.button.highlighted")?.withRenderingMode(.alwaysOriginal) 


self.navigationController?.navigationBar.backIndicatorImage = backButton 
self.navigationController?.navigationBar.backIndicatorTransitionMaskImage = backButtonHigh 
self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil) 

Was ich habe versucht, ist den UINavigationController in einer neuen Klasse wie diese dies nicht funktioniert

class RSRNavigationController: UINavigationController{ 
    override func viewDidLoad() { 
     super.viewDidLoad() 

self.navigationController?.navigationBar.setBackgroundImage(UIImage(named: "navigation.background"), for: .default) 

let backButton = UIImage(named: "Back.button")?.withRenderingMode(.alwaysOriginal) 
let backButtonHigh = UIImage(named: "Back.button.highlighted")?.withRenderingMode(.alwaysOriginal) 

self.navigationController?.navigationBar.backIndicatorImage = backButton 
self.navigationController?.navigationBar.backIndicatorTransitionMaskImage = backButtonHigh 
self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil) 
    } 
} 

zu verlängern. Es wird ohne Probleme laufen, aber es wird nichts tun.

Ich habe versucht, auch die folgenden

class RSRNavigationController: UINavigationBar{ 
    override func draw(_ rect: CGRect) { 
     super.draw(rect) 
     self.setBackgroundImage(UIImage(named: "navigation.background"), for: .default) 
     let backButton = UIImage(named: "Back.button")?.withRenderingMode(.alwaysOriginal) 
     let backButtonHigh = UIImage(named: "Back.button.highlighted")?.withRenderingMode(.alwaysOriginal) 
     self.backIndicatorImage = backButton 
     self.backIndicatorTransitionMaskImage = backButtonHigh 
     //self.backItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil) 
    } 

zu tun, aber ich nicht den Titel für die Zurück-Taste einstellen können zu sein scheinen.

Kann jemand das beheben?

Antwort

3

Ihr Problem liegt hier, wenn Sie Navigation INSIDE Ihre benutzerdefinierten Navigation Klasse

Statt tun

self.navigationController?.navigationBar.backIndicatorImage = backButton 

tun, um diese

self.navigationBar.backIndicatorImage = backButton 

Grund verweisen?

Wenn Sie Ihre benutzerdefinierte Klasse um UINavigationController erweitern, wird sie selbst zum navigationController. Und indem Sie self.navigationController ausführen, weisen Sie Ihre App an, nach einem navigationController zu suchen, in dem sich Ihr benutzerdefinierter navigationController befindet. Natürlich existiert ein solcher Nav-Controller nicht, weil Ihr benutzerdefinierter navController der Haupt- oder der oberste navController der App ist. Entfernen Sie einfach den Teil "self.navigationController" aus Ihrer benutzerdefinierten Klasse, der Rest des Codes, den Sie in Ihre viewDidLoad geschrieben haben, sollte gut funktionieren.

Wenn Sie noch irgendwelche Fragen zu stellen

0

Sie ändern diese Eigenschaften nicht selbst in den Navigationscontroller fühlen Sie sich frei haben, können Sie es in dem Viewcontroller zu ändern, die in einer Navigationssteuerung eingebettet ist. Diese Anpassung muss in einem übergeordneten ViewController Ihrer View-Controller vorgenommen werden.

hat diese Antwort mehr Info: https://stackoverflow.com/a/16913435/4004429

0

wenn Sie wollen einfach nur Gewohnheit die backbutton des navigationbar, können Sie diesen Code in Ihrem Kind-View-Controller hinzufügen:

func setupLeftBarItem() -> Void { 
    let originalImage = UIImage.init(named: "leftBatItem")?.withRenderingMode(.alwaysOriginal) 
    let leftBarItem = UIBarButtonItem.init(image: originalImage, style: .done, target: self, action: #selector(leftBarButtonItemDidTouch)) 

    navigationItem.leftBarButtonItem = leftBarItem 
} 

func leftBarButtonItemDidTouch() -> Void { 
    _ = navigationController?.popViewController(animated: true) 
} 
Verwandte Themen