Добавление кнопки настроек в UINavigationController

#swift #uinavigationcontroller #uibutton

#swift #uinavigationcontroller #uibutton

Вопрос:

Я пытаюсь добавить кнопку настроек в свой навигационный контроллер, поэтому у меня есть viewDidLoad(), приведенный ниже мой код не является полным кодом, поскольку stackoverflow не позволил бы мне вставить все это, но я думаю, что вся соответствующая информация приведена ниже. С этим кодом кнопка настроек не отображается на моем симуляторе. «‘ класс NewTabBar: UITabBarController {

 var transparentView = UIView()
var cellId = "Cell"

override func viewDidLoad() {
    super.viewDidLoad()
    
    //TableView
    slideView.register(UITableViewCell.self, forCellReuseIdentifier: "Cell")
    
    self.view.addSubview(middleButton)
    view.addSubview(slideView) // ova e fioka view-to ;)
    
    slideView.showsVerticalScrollIndicator = false
    slideView.backgroundColor = .white
    slideView.layer.cornerRadius = 15
    
    self.moreNavigationController.navigationBar.topItem?.rightBarButtonItem?.title = "Submit"
    self.moreNavigationController.navigationBar.topItem?.rightBarButtonItem?.isEnabled = false
    
    let homeTabBarItem = generateNavController(vc: ProfileController(), title: "Home", image:#imageLiteral(resourceName: "home"))
    let scheduleVC = UIStoryboard(name: "Home", bundle: nil).instantiateViewController(withIdentifier: "ScheduleTableViewController") as! ScheduleTableViewController
    let workOrderTabBarItem = generateNavController(vc: scheduleVC, title: "Work Orders", image: #imageLiteral(resourceName: "baseline_close_white_24pt") )
    let actionTabBarItem = generateEmptyNavController()
    let requestVC = UIStoryboard(name: "Actions", bundle: nil).instantiateViewController(withIdentifier: "AddRequestSceneIdentifier") as! ActionsViewController
    let requestTabBarItem = generateNavController(vc: requestVC, title: "Request", image: #imageLiteral(resourceName: "news"))
    let settingsTabBarItem =  generateNavController(vc: MoreSettingsViewController(), title: "More", image: #imageLiteral(resourceName: "list"))
    
    navigationItem.rightBarButtonItem = UIBarButtonItem(
        image: UIImage(named: "transport"),
        style: .plain,
        target: self,
        action: #selector(buttonTappedAction)
    )

    viewControllers = [homeTabBarItem, workOrderTabBarItem, actionTabBarItem, requestTabBarItem, settingsTabBarItem]//,actionTabBarItem, requestTabBarItem, settingsTabBarItem]
    
    NSLayoutConstraint.activate([

        middleButton.widthAnchor.constraint(equalToConstant: 80),
        middleButton.heightAnchor.constraint(equalToConstant: 80),
        middleButton.centerXAnchor.constraint(equalTo: view.centerXAnchor),
        middleButton.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: -15),
        ])
    
    //actions
    let swipeDown = UISwipeGestureRecognizer(target: self, action: #selector(handleGesture)) //gesture recognizer definicija sho da povikuva koga kje detektira (vo sluchajov swipe)
    swipeDown.direction = .down
    self.slideView.addGestureRecognizer(swipeDown) // dodavanje na koe view da cheka/detektira (collectionview) i koj gesture swipeDown
}

@objc func buttonTappedAction(sender: UIBarButtonItem){
    print("settings tapped")
}

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    view.bringSubviewToFront(middleButton)
}

fileprivate func generateEmptyNavController() -> UINavigationController {
    let navController = UINavigationController()
    return navController
}

fileprivate func generateNavController(vc: UIViewController, title: String, image: UIImage) -> UINavigationController {
    //vc.navigationItem.title = title
    let navController = UINavigationController(rootViewController: vc)
    navController.title = title
    navController.tabBarItem.image = image
    return navController
}
  

}
}

И теперь на картинке «withoutSettingsButton» все так, как сейчас, а на картинке «withSettingsButton» все так, как должно быть, вместо красной точки должен быть значок настроек. Спасибо. Без настройки кнопки с настройкой кнопки

** приведены изображения ниже

Комментарии:

1. Пожалуйста, поделитесь кодом вашего ViewController, этого небольшого сокращения недостаточно, чтобы выявить проблему

2. Ваш код неясен, и не могли бы вы поделиться изображением текущего пользовательского интерфейса и тем, что вы ожидаете?

3. @AlexGoergisn этого достаточно? или вы предпочитаете git link с полным кодом?

4. @Kudos я вставил изображения

5. Я добавил несколько примеров кода в качестве ответа. Короче говоря: вы устанавливаете navigationItem вашего UITabBarController, который не влияет на ваши настройки. Вместо этого вы должны установить ее на каждом контроллере представления, который содержится в контроллере навигации 😉

Ответ №1:

Вы устанавливаете кнопку как левую или правую кнопку навигационного контроллера?

 navigationItem.leftBarButtonItem = UIBarButtonItem(...)
  

или

 navigationItem.rightBarButtonItem = UIBarButtonItem(...)
  

Ответ №2:

Вам необходимо установить navigationItem на каждом контроллере представления, который содержит навигационный контроллер.

В вашем сценарии вы могли бы сделать следующее после настройки ViewControllers.

 ...

viewControllers = [homeTabBarItem, workOrderTabBarItem, actionTabBarItem, requestTabBarItem, settingsTabBarItem]//,actionTabBarItem, requestTabBarItem, settingsTabBarItem]

viewControllers?.forEach({ (controller) in
    let viewController = (controller as? UINavigationController)?.topViewController ?? controller
    viewController.navigationItem.rightBarButtonItem = UIBarButtonItem(
        image: UIImage(named: "transport"),
        style: .plain,
        target: self,
        action: #selector(self.buttonTappedAction)
    )
})

...