2017-05-04 29 views
0

我以故事板和一個UITabBarItem - 菜單以編程方式添加了2個tabBar項目。我成功地能夠打開與我使用storyboard創建的tabBarItems對應的控制器。然而,當我點擊「菜單」出現黑屏,無法看到控制器以編程方式添加到UITabBar 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) 
} 
} 

我跟着幾個教程添加標籤欄項目,但他們都有我寫的代碼。我錯過了一些非常基本的東西嗎? The three dots represent menu. The word menu is not included because in the real code I gave a blank string

編輯:

類的菜單控制

@objc public class MyViewController:UIViewController { 

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

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

顯示背屏(菜單)控制器代碼 –

+0

感謝您尋找到它。編輯問題 –

+0

我不認爲MyViewController()會給你InstantiatedViewController –

回答

1

您的應用做什麼你的代碼是告訴它做的事。您正在創建MyViewController的實例並將其添加到UITabBarController的視圖控制器陣列中。

您的MyViewController類文件只是定義了一個空白的黑色視圖。

我猜你在Storyboard中創建了一個你想用作MyViewController的ViewController?如果是這樣,你需要從故事板實例化。

當你編輯的故事板,分配MyViewController類的VC要使用,並給它一個Storyboard ID - 如MyVC。然後,編輯viewDidLoad功能如下:

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

是的,我在故事板中創建了控制器。爲什麼你在一個括號內寫tabBarItem和其他聲明?當我這樣做時,我得到一個錯誤。現在,我使用 let sb = UIStoryboard(名稱:「Utility」,bundle:nil) 讓tabController = sb.instantiateViewController(withIdentifier:「MyViewController」)as? MyViewController和其他代碼行如下。但屏幕仍然是空白的。 –

+0

「括號內」的代碼位於「if let」結構中,這有助於避免強制展開和零選項。在你的'let sb = UIStoryboard(name:「Utility」,bundle:nil)'line上放一個斷點,檢查你正在創建的變量/對象的值。看看是否有什麼失敗。 – DonMag

+0

非常感謝您的幫助和解釋。解決方案奏效! –

0

既然你編程即創建視圖控制器。沒有nib/storyboard,你負責實例化一個UIView對象並設置視圖控制器的視圖屬性。要做到這一點,實現loadView方法並分配視圖對象來查看viewController的屬性。那麼你可以添加自定義視圖到視圖對象,檢查下面的代碼。

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

這將是很好的使用情節提要/筆尖爲了這個目的,你可以輕鬆地配置使用界面生成器的自動佈局,而不是編程方式做自定義視圖/控制。 :)

編輯:

如果傻冒用故事板則實例化視圖控制器如下面的代碼給出

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

我用故事板創建了UIViewController。然後將其與我的課程相關聯 –

+0

您是否嘗試過沒有故事板的代碼?如果你使用故事板,那麼你需要使用代碼來實例化視圖控制器,如let tabController = UIStoryboard(name:「Main」,bundle:nil).instantiateViewController(withIdentifier:「MainViewController」)as! MainViewController – suhit

相關問題