Установить заголовок панели навигации, используя строковую переменную - PullRequest
0 голосов
/ 11 марта 2019

Я устанавливаю заголовок панели навигации следующим образом:

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 следующим образом (не знаю, что случилось с форматированием первых 2 строк!):

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

1 Ответ

1 голос
/ 12 марта 2019

В настоящее время есть только одно место, где вы устанавливаете title, и это в viewDidLoad.По сути, вам нужно присваивать chosenLanguage title каждый раз, когда chosenLanguage изменяется.

Причина в том, что строки являются типами значений в Swift.Поэтому, когда вы присваиваете переменную title, вы фактически копируете текущее значение переменной в title.Любые изменения в переменной впоследствии не влияют на title.

(Если бы вы писали это в Objective-C, у которого нет типов значений, то же самое произошло бы, потому что свойство title используетcopy атрибут.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...