2017-05-04 4 views
0

Ich habe 2 TabBar-Elemente vom Storyboard und ein UITabBarItem - Menü programmgesteuert hinzugefügt. Ich bin in der Lage, die Controller zu öffnen, die TabBarItems entsprechen, die ich unter Verwendung des Storyboards erstellte. Allerdings, wenn ich auf „Menü“ klicken ein leerer schwarzer Bildschirm angezeigt wird,Der Controller konnte UITabBar nicht programmgesteuert hinzugefügt werden. Swift

@objc public class MainScreenTabsController : UITabBarController { 
public override func viewDidLoad() { 
    super.viewDidLoad() 
    let tabController = MyViewController() 
    let tabBarItem = UITabBarItem(title: "Menu", image: UIImage(named: "more-options.png"), selectedImage: UIImage(named: "more-options")) 
    tabController.tabBarItem = tabBarItem 
    var array = self.viewControllers 
    array?.append(tabController) 
    self.viewControllers = array 
} 

public func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool { 
    return true; 
} 

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

Ich folgte paar Tutorials für das Hinzufügen von Tab-Leiste Element aber alle von ihnen hatten den Code, den ich geschrieben habe. Verpasse ich etwas sehr Grundlegendes? The three dots represent menu. The word menu is not included because in the real code I gave a blank string

EDIT:

Klasse für Menü-Controller

@objc public class MyViewController:UIViewController { 

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

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

zeigen zurück Bildschirm (Menü) Controller-Code –

+0

Dank für das in sie suchen. Bearbeitet die Frage –

+0

Ich glaube nicht, MyViewController() wird Ihnen InstantiatedViewController –

Antwort

1

Ihre App genau das tut, was Ihr Code sagt, es zu tun. Sie erstellen eine Instanz von MyViewController und fügen sie dem Array View View Controllers UITabBarController hinzu.

Ihre Klassendatei MyViewController definiert einfach eine leere, schwarze Ansicht.

Ich vermute, Sie haben einen ViewController in Ihrem Storyboard erstellt, den Sie als MyViewController verwenden möchten? Wenn dies der Fall ist, müssen Sie das aus dem Storyboard instanziieren.

Wenn Sie Ihr Storyboard bearbeiten, ordnen Sie die MyViewController Klasse dem VC Sie verwenden möchten, und es auch eine Storyboard ID geben - wie MyVC. Dann bearbeiten Sie Ihre viewDidLoad Funktion dazu:

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

    // wrong way 
    // let tabController = MyViewController() 

    if let tabController = storyboard?.instantiateViewController(withIdentifier: "MyVC") as? MyViewController { 

     let tabBarItem = UITabBarItem(title: "Menu", image: UIImage(named: "more-options.png"), selectedImage: UIImage(named: "more-options")) 
     tabController.tabBarItem = tabBarItem 
     var array = self.viewControllers 
     array?.append(tabController) 
     self.viewControllers = array 

    } 

} 
+0

Ja, ich erstelle den Controller im Storyboard. Warum haben Sie tabBarItem und andere Deklarationen innerhalb einer Klammer geschrieben? Wenn ich es mache, erhalte ich einen Fehler.Jetzt bin ich instanziieren mit Let sb = UIStoryboard (Name: "Dienstprogramm", Bündel: Nil) Lassen Sie TabController = sb.InstantiateViewController (withIdentifier: "MyViewController") als? MyViewController und andere Codezeilen folgen diesem. Aber der Bildschirm ist immer noch leer. –

+0

Der Code "in Klammern" befindet sich innerhalb eines 'if let'-Konstrukts, das hilft, Zwangsauswicklungen und keine Optionals zu vermeiden. Setzen Sie einen Haltepunkt auf die Zeile "Let sb = UIStoryboard (Name:" Utility ", bundle: nil)" und durchlaufen Sie die Werte der Variablen/Objekte, die Sie erstellen. Sehen Sie, wenn etwas scheitert. – DonMag

+0

Vielen Dank für die Hilfe und Erklärung. Die Lösung hat funktioniert! –

0

Da Sie die Viewcontroller programmatisch dh sind zu schaffen. Ohne Nib/Storyboard sind Sie für das Instanziieren eines UIView-Objekts und das Festlegen der Ansichtseigenschaft des Ansichtscontrollers verantwortlich. Dazu implementieren Sie die Methode loadView und weisen das View-Objekt der View-Eigenschaft von viewController zu. Anschließend können Sie dem Ansichtsobjekt benutzerdefinierte Ansichten hinzufügen. Überprüfen Sie den folgenden Code.

class MyViewController: UIViewController { 

    override func loadView() { 
     // super.loadView() // DO NOT CALL SUPER 

     //create view 
     view = UIView() 
     view.backgroundColor = UIColor.white 

     //Add a custom view with red color 
     let customView = UIView() 
     customView.translatesAutoresizingMaskIntoConstraints = false 
     customView.backgroundColor = UIColor.red 
     view.addSubview(customView) 

     NSLayoutConstraint.activate(
      [customView.leadingAnchor.constraint(equalTo: view.leadingAnchor), 
      customView.trailingAnchor.constraint(equalTo: view.trailingAnchor), 
      customView.topAnchor.constraint(equalTo: view.topAnchor), 
      customView.bottomAnchor.constraint(equalTo: view.bottomAnchor)] 
     ) 
    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     // Do any additional setup after loading the view. 
    } 
} 

Es wäre gut, Storyboard/Nib für diesen Zweck zu verwenden, wie Sie leicht Ansichten individuelle Konfiguration können/steuert das automatische Layout in Interface Builder verwenden, anstatt es programmatisch zu tun. :)

Edit:

wenn your'e Storyboard verwenden, dann View-Controller wie

Code unten gegeben in instanziiert
class MainScreenTabsController: UITabBarController, UITabBarControllerDelegate { 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view. 
     let tabController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "MainViewController") as! MainViewController //if using storyboard 
     let icon = UITabBarItem(title: "Menu", UIImage(named: "more-options.png"), selectedImage: UIImage(named: "more-options"))) 
     tabController.tabBarItem = icon 
     var controllers = self.viewControllers 
     controllers?.append(tabController) 
     self.setViewControllers(controllers!, animated: true) 
    } 
} 
+0

Ich habe UIViewController mit einem Storyboard erstellt. und dann verlinkt das mit meiner Klasse –

+0

hast du den Code ohne Storyboard ausprobiert? Wenn Sie das Storyboard verwenden, müssen Sie den View-Controller mithilfe von Code wie tabController = UIStoryboard (Name: "Main", Bundle: Nil) .instantiateViewController (withIdentifier: "MainViewController") as instanziieren! HauptansichtController – suhit

Verwandte Themen