导航栏标题文本不会随标题文本属性而更改



我有一个奇怪的问题,我不太明白。

我有两种观点,一种应该有一个黑色的标题,另一个应该有一个白色的标题。

我遇到的问题是我可以设置一次颜色而不将其更改回来。

因此,当我从具有黑色标题的视图中转到具有白色标题的视图,然后返回时,标题不会更改回黑色。

视图中白色标题的代码将出现:

self.navigationController?.navigationBar.barStyle = .black
self.navigationController?.navigationBar.tintColor = .white
self.navigationController?.navigationBar.titleTextAttributes = [NSAttributedStringKey.foregroundColor: UIColor.white]

视图中黑色标题的代码将出现:

self.navigationController?.navigationBar.isHidden = false
self.navigationController?.navigationBar.barStyle = .default
self.navigationController?.navigationBar.tintColor = UIColor.blue
self.navigationController?.navigationBar.titleTextAttributes = [NSAttributedStringKey.foregroundColor: UIColor.black]

为什么当我清楚地设置新颜色时,它不会变回来?

编辑:添加完整代码

黑色标题视图:

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    self.navigationController?.navigationBar.isHidden = false
    self.navigationController?.navigationBar.barStyle = .default
    self.navigationController?.navigationBar.tintColor = hexStringToUIColor(hex: "4CAF50")
    self.navigationController?.navigationBar.titleTextAttributes = [NSAttributedStringKey.foregroundColor: UIColor.black]
    self.navigationItem.title = listData.name
    clearStatusBarColor()
    let editButton = UIBarButtonItem(title: "Edit", style: .plain, target: self, action: #selector(tapToEdit))
    let sortImg = UIImage(named: "sort")
    sortingButton = UIBarButtonItem(image: sortImg, style: .plain, target: self, action: #selector(tapToSort))
    self.navigationItem.rightBarButtonItems = [sortingButton!, editButton]
    self.navigationController?.navigationBar.setBackgroundImage(nil, for: UIBarMetrics.default)
    self.navigationController?.navigationBar.shadowImage = nil
    // get updated Data
    if User.active.hasListUpdated {
        // return with new gameEntries -> Update
        listData = User.active.allLists![listDataIndex] // To keep upToDate data!
        listEntries = listData.list_entries!
        gameEntries = listEntries.compactMap({ (entry: ListEntry) -> GameEntry in
            return GameEntry(game: entry.game, platform: nil, platform_id: entry.platform, rating: Int(entry.rating ?? 0), review: nil, notes: entry.description)
        })
        listTable.reloadData()
    }
    // Sorting
    if hasSortChanged {
        hasSortChanged = false
        sortList(sort: sortingOption, order: sortingOrder)
    }
}

白色标题视图:

    override func viewWillAppear(_ animated: Bool) {
    if !isPreviewing {
        self.navigationController?.navigationBar.isHidden = false
        self.navigationController?.navigationBar.barStyle = .black
        self.navigationController?.navigationBar.tintColor = .white
        self.navigationController?.navigationBar.titleTextAttributes = [NSAttributedStringKey.foregroundColor: UIColor.white]
        // MARK: Clear StatusBar
        clearStatusBarColor()
        if transparentNav {
            self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for:UIBarMetrics.default)
            self.navigationController?.navigationBar.shadowImage = UIImage()
            self.title = nil
        } else {
            self.navigationController?.navigationBar.setBackgroundImage(nil, for: UIBarMetrics.default)
            self.navigationController?.navigationBar.shadowImage = nil
            self.title = game.name!
        }
    }
    // MARK: NavigationBar
    let button = UIBarButtonItem(barButtonSystemItem: .add, target: self, action: #selector(showOptions))
    self.navigationItem.rightBarButtonItem = button

    // Check if game should have new review or rating
    if User.active.hasMainScreenUpdated {
        // Update rating
        updateUserRating()
        // update review
        updateUserReviewStatus()
    }
    // Update lists! 
    if User.active.hasListUpdated {
        updateListsStatus()
    }
}

如果您要更改不同视图控制器中的导航栏颜色,我建议您拥有UIViewController的子类,并通过该子类处理导航栏更改。下面是您的案例的示例。

class CustomUIViewController: UIViewController {
    override func didMove(toParentViewController parent: UIViewController?) {
        super.didMove(toParentViewController: parent)
        if parent == nil {
            if SettingsManager.LastBarColor == .default {
                self.setLightBars()
            }
            else {
                self.setDarkBars()
            }
        }
    }
    func setDarkBars() {
        SettingsManager.LastBarColor = .lightContent
        UIApplication.shared.statusBarStyle = UIStatusBarStyle.lightContent
        tabBarController?.tabBar.tintColor = UIColor.white
        navigationController?.navigationBar.titleTextAttributes = [NSAttributedStringKey.foregroundColor: UIColor.white]
    }
    func setLightBars() {
        SettingsManager.LastBarColor = .default
        UIApplication.shared.statusBarStyle = UIStatusBarStyle.default
        tabBarController?.tabBar.tintColor = UIColor.Black
        navigationController?.navigationBar.titleTextAttributes = [NSAttributedStringKey.foregroundColor:UIColor.Black]
        navigationController?.navigationBar.barTintColor = UIColor.white
        navigationItem.titleView?.tintColor = UIColor.Black
    }
}
class SettingsManager {
    class var LastBarColor: UIStatusBarStyle = .default
}

在视图控制器中使用 CustomUIViewController,在 viewWillAppear(( 函数中调用 setDarkBars(( 或 setLightBars((。

您可以使用自定义 UINavigationController 类,然后覆盖 pushViewController 函数以在导航栏上设置所需的内容。

viewWillAppear方法在这里有很多代码。

class MyNavigationViewController: UINavigationController {
    override func pushViewController(_ viewController: UIViewController, animated: Bool) {
        super.pushViewController(viewController, animated: animated)
        self.updateForVC(viewController: viewController)
    }
    func updateForVC(viewController: UIViewController) {
        //DO WHATEVER YOU WHANT HERE, title, img, etc
        var color = UIColor.black
        if viewController.isKind(of: MyClass.self) {
            color = UIColor.white
        }
        self.navigationBar.titleTextAttributes = [NSAttributedStringKey.foregroundColor: color]
    }
}   

尝试 pushViewController 进行导航,它正在为我工作

if let viewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "SecondViewController") as? SecondViewController {
      if let navigator = self.navigationController {
        navigator.pushViewController(viewController, animated: true)
       viewController.title = ""
      }
    }

相关内容

  • 没有找到相关文章

最新更新