使用titleTextAttributes

时间:2018-04-10 09:08:02

标签: ios swift

我有一个我不太懂的奇怪问题。

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

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

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

viewWillAppear中的白色标题代码:

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

viewWillAppear中的黑色标题代码:

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

}

3 个答案:

答案 0 :(得分:1)

如果要更改不同视图控制器中的导航栏颜色,我建议您使用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()。

答案 1 :(得分:0)

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

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

}   

答案 2 :(得分:0)

尝试使用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 = ""
      }
    }