【问题标题】:Set navigation bar title using string variable使用字符串变量设置导航栏标题
【发布时间】:2019-03-11 20:32:55
【问题描述】:

我正在这样设置导航栏标题:

override func viewDidLoad() {
    super.viewDidLoad()

    languageMenu()

    let titleAttributes = [NSAttributedString.Key.font: UIFont(name: "AmericanTypewriter", size: 22)!]
    navigationController?.navigationBar.titleTextAttributes = titleAttributes
    title = "POLYGLOT"

    navigationItem.leftBarButtonItem = UIBarButtonItem(barButtonSystemItem: .add, target: self, action: #selector(addNewWord))
}

这适用于字符串文字,即“POLYGLOT”。 我想使用一个名为 selectedLanguage 的字符串变量,它会根据用户在启动时选择的语言作为标题的值来更改值。

当我尝试此操作时,导航栏标题区域中没有显示任何内容。我在网上搜索时没有看到任何这样的例子。

变量 selectedLanguage 是在 languageMenu 方法中设置的(不知道前两行的格式发生了什么!):

导入 UIKit

类 ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

@IBOutlet weak var languageButton: UIButton!
@IBOutlet weak var tableView: UITableView!

var words = [String]()
var chosenLanguage = String()
var languageSaved = String()
var toolbar = UIToolbar()

override func viewDidLoad() {
    super.viewDidLoad()

    languageMenu()

    let titleAttributes = [NSAttributedString.Key.font: UIFont(name: "AmericanTypewriter", size: 22)!]
    navigationController?.navigationBar.titleTextAttributes = titleAttributes
    title = chosenLanguage

    navigationItem.leftBarButtonItem = UIBarButtonItem(barButtonSystemItem: .add, target: self, action: #selector(addNewWord))
}

@objc func languageMenu(){

    let chooseLanguage = UIAlertController(title: "Vocabulary Tutor", message: "Choose a Language", preferredStyle: .actionSheet)

    let germanButton = UIAlertAction(title: "German", style: .default, handler: { (action) -> Void in
        self.chosenLanguage = "german"
        print("Choosen language is: \(self.chosenLanguage)")
        self.loadInitialValues()
    })

    let frenchButton = UIAlertAction(title: "French", style: .default, handler: { (action) -> Void in
        self.chosenLanguage = "french"
        print("Choosen language is: \(self.chosenLanguage)")
        self.loadInitialValues()
    })

    chooseLanguage.addAction(germanButton)
    chooseLanguage.addAction(frenchButton)

    self.navigationController!.present(chooseLanguage, animated: true, completion: nil)

    if let defaults = UserDefaults(suiteName: "group.co.uk.tirnaelectronics.polyglot") {
        if chosenLanguage == "german" {
            defaults.set(chosenLanguage, forKey: "languageChosen")
        } else {
            defaults.set(chosenLanguage, forKey: "languageChosen")
        }
    }
}

【问题讨论】:

  • 向我们展示您选择的语言变量以及您在哪里设置它
  • 在设置变量之前放置断点可能有助于调试此问题。很可能您没有正确设置变量。
  • 什么是 loadInitialValues?
  • @El Tomato 它加载从一开始就被编程的英语和外语单词,而不是由用户添加。

标签: ios swift variables navigationbar titlebar


【解决方案1】:

目前只有一个地方可以设置title,那就是在viewDidLoad 中。基本上,每次chosenLanguage 更改时,您都需要将chosenLanguage 分配给title

原因是字符串在 Swift 中是值类型。因此,当您将变量分配给title 时,您实际上所做的是将变量的当前值复制到title 中。之后对变量的任何更改都不会影响title

(如果您在没有值类型的 Objective-C 中编写此代码,则会发生同样的事情,因为 title 属性使用了 copy 属性。)

【讨论】:

  • 确实如此!我只是假设如果我在将 selectedLanguage 分配给 title 之前调用 languageMenu 它将起作用。我现在意识到,即使它工作一次,它也不会在其他视图控制器之间来回移动时重新分配它。
  • 很高兴听到这个消息。确保有机会时将我的答案标记为已接受的答案。
猜你喜欢
  • 2019-10-28
  • 1970-01-01
  • 2011-01-17
  • 1970-01-01
  • 2011-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多