0

UINavigationController ツールバーをプログラムで作成するのに問題があります。以前はストーリーボードを使用してこれを成功させましたが、すべてコードで実行してみたいと思います。

プログラムで 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()
    }

 }

編集* UINavigationController 内で ProgOneViewController をインスタンス化するために使用されるコードは次のとおりです。

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

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

ストーリーボードで作成したビュー コントローラーのボタンをクリックすると、この関数が呼び出されました。関数シグネチャは、どのviewControllerがテストであるかを指定するために長かった(プログラムで作成された):)

4

1 に答える 1

1

まず最初に、ProgOneViewControllerが本当に に含まれていることを確認する必要がありますUINavigationController。その場合は、ツールバーと barbuttonitems が表示されます (私のプロジェクトでコードを試してみました)。

ただし、barbuttonitem のすべての宣言を に変更して、宣言内のlazy varへの参照がselfviewcontroller を指し、target-action が機能するようにする必要があります。

ご不明な点がございましたら、お気軽にお問い合わせください:)

于 2017-01-08T10:14:56.947 に答える