2017-01-08 71 views
0

我在編程方式創建UINavigationController工具欄時遇到問題。我以前曾使用故事板成功完成此操作,但希望嘗試在代碼中完成所有操作。iOS Swift以編程方式創建導航控制器工具欄(底部欄)項目操作不起作用

我以編程方式創建了UIBarButtonItems,但實際功能或操作按下時它們應該執行不起作用。

爲了澄清,我不試圖將UIBarButtonItems添加到頂部欄。我看到幾十個問題都提出同樣的問題。我指的是UINavigationController附帶的底部的工具欄。這意味着,沒有 「rightBarButtonItem」 或 「leftBarButtonItem」

下面是代碼:

class ProgOneViewController: UIViewController { 
    var chatRoomsButton: UIBarButtonItem = { 
     var button = UIBarButtonItem(title: "Chats", style: .plain, target: self, action: #selector(segueToChatRoomController(_:))) 
     return button 
    }() 

    var exploreButton: UIBarButtonItem = { 
     var button = UIBarButtonItem(title: "Explore", style: .plain, target: self, action: #selector(segueToExploreController(_:))) 
     return button 
    }() 

    var profileButton: UIBarButtonItem = { 
     var button = UIBarButtonItem(title: "Profile", style: .plain, target: self, action: #selector(segueToProfileController(_:))) 

     return button 
    }() 

    // Flexible spaces that are added in between each button. 
    var flexibleSpace1: UIBarButtonItem = { 
     var flexibleSpace = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: self, action: nil) 
     return flexibleSpace 
    }() 

    var flexibleSpace2: UIBarButtonItem = { 
     var flexibleSpace = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: self, action: nil) 
     return flexibleSpace 
    }() 

    var flexibleSpace3: UIBarButtonItem = { 
     var flexibleSpace = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: self, action: nil) 
     return flexibleSpace 
    }() 

    var flexibleSpace4: UIBarButtonItem = { 
     var flexibleSpace = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: self, action: nil) 
     return flexibleSpace 
    }() 

    // These are the functions that are not being called for some mysterious reason. 
    func segueToChatRoomController(_ sender: Any) { 
     print("segueing to chat rooms controller") 
     let chatRoomsController = ChatRoomsViewController() 
     let navController = UINavigationController(rootViewController: chatRoomsController) 
     self.present(navController, animated: false, completion: nil) 
    } 

    func segueToExploreController(_ sender: Any) { 
     print("segueing to explore controller") 
     let exploreController = ExploreCollectionViewController() 
     let navController = UINavigationController(rootViewController: exploreController) 
     self.present(navController, animated: false, completion: nil) 
    } 

    func segueToProfileController(_ sender: Any) { 
     print("segueing to profile controller") 
     let profileController = ProfileTableViewController() 
     let navController = UINavigationController(rootViewController: profileController) 
     self.present(navController, animated: false, completion: nil) 
    } 

    func setUpToolbar() { 
     print("setting up toolbar") 

     self.navigationController?.setToolbarHidden(false, animated: false) 
     self.navigationController?.toolbar.isUserInteractionEnabled = true 

     let toolBarItems = [flexibleSpace1, chatRoomsButton, flexibleSpace2, exploreButton, flexibleSpace3, profileButton, flexibleSpace4] 

     self.setToolbarItems(toolBarItems, animated: true) 
     // For some reason, these two methods leave the toolbar empty. 

     //self.navigationController?.setToolbarItems(toolBarItems, animated: true) 

     //self.navigationController?.toolbar.items = toolBarItems 
    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     self.view.backgroundColor = UIColor.white 

     setUpToolbar() 
    } 

} 

編輯* 這裏是用來實例化ProgOneViewController一個UINavigationController

func pushToTestProgrammaticallyCreatedViews() { 
    let progOneViewController = ProgOneViewController() 
    let navController = UINavigationController(rootViewController: progOneViewController) 
    //navController.isToolbarHidden = false 
    //progOneViewController.setUpToolbar() 

    self.present(navController, animated: false, completion: nil) 
} 

我叫裏面的代碼這個功能通過點擊故事板創建的視圖控制器中的按鈕。函數簽名很長,以指定哪些viewControllers是測試(以編程方式創建):)

+0

僅供參考 - 您只需要一個靈活的空間。它可以在同一個工具欄中多次使用。 – rmaddy

+0

感謝您的提示。我之所以不這樣做,是因爲視圖控制器子視圖列表通常在故事板中顯示的方式。 –

回答

1

首先,您必須確保ProgOneViewController確實包含在UINavigationController中。如果是這種情況,工具欄以及barbuttonitems都會顯示出來(在我的項目中嘗試了您的代碼)。

除了您必須將所有barbuttonitem聲明更改爲lazy var,以便在聲明中引用self指向viewcontroller和target-action工程。

隨時詢問是否有任何問題:)

+0

謝謝!對此,我真的非常感激。我確實將viewController嵌入到導航控制器中。它是在另一個視圖控制器中聲明的。懶惰的關鍵字是我需要研究的。但再次感謝! –

相關問題