2017-11-09 3 views
0

Ich habe eine UITabBar mit eigenen UITabBarController und in diesem Controller mache ich einige Anpassungen an der TabBar wie TabBar Elemente deaktivieren/aktivieren. Ich mache es in ViewDidLoad.UITabBar deaktivieren/aktivieren Elemente auf UIButton klicken

Auslöser für diese Anpassungen wird jedoch auf einer der zugehörigen Registerkarten und es View Controller sein. Der Auslöser wird eine Schaltfläche sein und sobald die Schaltfläche gedrückt wird, sollte einer der Punkte auf der Registerkarte von "deaktiviert" zu "aktiviert" gehen.

Gibt es eine TabBar Reload-Funktion, die ich verwenden muss oder muss ich irgendwie UITabBarController neu laden, um dies zu ermöglichen?

Danke - ich schätze jede Hilfe, die Sie zur Verfügung stellen können!

Bearbeiten: Meine VCs für UITabBarController und UIViewController sind unten.

UITabBarController

class TabBarVC: UITabBarController, TopRatedVCDelegate { 


var tabBarItem1 = UITabBarItem() 
var tabBarItem2 = UITabBarItem() 
var tabBarItem3 = UITabBarItem() 
var tabBarItem4 = UITabBarItem() 

override func viewDidLoad() { 
    super.viewDidLoad() 
} 

func setbar() { 

    let tabBarControllerItems = tabBar.items 

    if let tabArray = tabBarControllerItems { 
     tabBarItem1 = tabArray[0] 
     tabBarItem2 = tabArray[1] 
     tabBarItem3 = tabArray[2] 
     tabBarItem4 = tabArray[3] 
    } 
     tabBarItem1.isEnabled = true 
     tabBarItem1.badgeValue = "99" 
     tabBarItem2.isEnabled = false 
     tabBarItem3.isEnabled = true 
     tabBarItem4.isEnabled = true 
} 
} 

UIViewController mit Taste, um Sie

protocol TopRatedVCDelegate: class { 
    func setbar() 
} 

class TopRatedVC: UIViewController { 

@IBOutlet weak var userDefValueLbl: UILabel! 

weak var delegate: TopRatedVCDelegate? 

override func viewDidLoad() { 
    super.viewDidLoad() 

} 


@IBAction func btnPressed(_ sender: Any) { 
    delegate?.setbar() 
} 
} 
+0

Sie möchten wahrscheinlich Protocol/Delegate-Muster verwenden. Dadurch kann Ihre Trigger-Taste zu Ihrem benutzerdefinierten UITabBarController zurückrufen, wo Sie die Tabs zum Deaktivieren/Aktivieren (oder was auch immer Sie tun möchten) handhaben können. – DonMag

+0

Das klingt wie es funktionieren kann. Hast du ein Beispiel, wie ich das machen kann? Ich habe es tatsächlich auf eine andere Art und Weise versucht, indem ich einen Wert in UserDefaults gespeichert habe, sobald die Schaltfläche gedrückt und die Überprüfung durchgeführt wurde, aber in UITabBarController, aber das funktionierte erst, nachdem die TabBar geladen wurde. Ich möchte, dass es funktioniert, wann immer ich will - so das "Reload" der Bar zu nennen, sobald die Schaltfläche für die Überprüfung durchgeführt wird ... –

Antwort

0

mir die Delegation Muster Lassen Sie erklären. Es ist eine effiziente Möglichkeit, zwischen Komponenten wie Controllern und Ansichten zu kommunizieren. Sie müssen 6 Schritte folgen:

  1. Sie müssen ein Protokoll mit Ihren Anforderungen hinzufügen. In Ihrem Fall können Sie eine Funktion namens updateTabItems hinzufügen, um Registerkartenelemente zu aktivieren oder zu deaktivieren.
  2. Sie benötigen einen Delegaten Eigenschaft mit dem Protokolltyp hinzufügen, die Sie wie folgt erstellen: die Funktion des Delegierten Eigenschaft wie folgt weak var delegate: ProtocolType?
  3. Call: delegate?.updateTabItems()
  4. Auf dem zweiten Controller an, oder Komponente, braucht es zu Ihrem Protokoll wie diese class Controller : YourProtocol
  5. Dann anzupassen, müssen Sie self
  6. Schließlich implementieren die Methode updateTabItems
der Delegat Eigenschaft festlegen 10

Hier ist die vollständige Erklärung des Delegationsmusters. Sehr wichtig und sehr nützlich für Ihre tägliche Routine als IOS-Entwickler: Delegation pattern

+0

Hallo, Dies ist großartig! Vielen Dank für das Senden. Ich denke, ich verstehe es, aber ich habe eine Frage. In Punkt 5 sprechen Sie darüber, die Eigenschaft delegate auf self zu setzen.Im Beispielartikel (Delegationsmuster) setzt der Typ es in der prepareForSegue-Methode. Ich führe keine Übergänge durch, daher bin ich mir nicht wirklich sicher, wo ich den Delegierten selbst einstellen soll. Als Referenz habe ich den Code von meinen VCs zur ursprünglichen Frage hinzugefügt. –

+0

Im Allgemeinen müssen Sie es dort platzieren, wo Sie auf die Delegat-Eigenschaft zugreifen können, die Sie in die andere Klasse einfügen. Im Beispiel stellt er es in prepareForSegue ein, weil es einen View-Controller instanziiert, mit dem er auf die Eigenschaft delegate zugreifen und sie festlegen kann. – Arrabidas92

+0

Ich habe mir ein paar Videos angeschaut und jeder, der die Methode erklärt, instanziiert das VC mit prepareForSegue, was für mich nicht nutzbar ist, da das Wechseln zwischen Tabs auf TabBar kein echtes Segment ist, also ist es mir unklar, wo ich es eigentlich instanziieren kann: - \ –

Verwandte Themen