Swift 在UINavigationController中添加设置按钮

Swift 在UINavigationController中添加设置按钮,swift,uinavigationcontroller,uibutton,Swift,Uinavigationcontroller,Uibutton,我试图在导航控制器中添加一个设置按钮,因此在viewDidLoad()中 我下面的代码不是完整的代码,因为stackoverflow不允许我全部粘贴,但我认为所有相关信息都在下面。使用此代码时,设置按钮不会显示在我的模拟器上。 ''' 新ABBAR类:UITabBarController{ var transparentView = UIView() var cellId = "Cell" override func viewDidLoad() { super.vi

我试图在导航控制器中添加一个设置按钮,因此在viewDidLoad()中 我下面的代码不是完整的代码,因为stackoverflow不允许我全部粘贴,但我认为所有相关信息都在下面。使用此代码时,设置按钮不会显示在我的模拟器上。 ''' 新ABBAR类: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
}
} }

现在在图片“WithingSettingsButton”上是它现在的样子,在图片“WithingSettingsButton”上是它需要的样子,而红点应该有一个设置图标。谢谢


**下面的图片是

您是将该按钮设置为导航控制器的左按钮还是右按钮

navigationItem.leftBarButtonItem = UIBarButtonItem(...)


您需要在包含导航控制器的每个视图控制器上设置
navigationItem

在您的场景中,可以在设置ViewController后执行以下操作

...

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

...

请分享你的ViewController的代码,这个小片段不足以发现问题你的代码不清楚,你能分享当前UI的图像和你期望的吗?@AlexGoergisn这够了吗?或者你更喜欢带有完整代码的git链接?@Kudos我插入了Pisctureresi,我添加了一些示例代码作为答案。简而言之:您正在设置UITabBarController的navigationItem,它在您的设置中不起任何作用。相反,您必须在导航控制器中包含的每个视图控制器上设置它;)
...

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

...