Как «войти» в определенный режим оператора switch, когда он зависит от заданной настройки области? - PullRequest
0 голосов
/ 07 января 2019

В моем приложении доступно несколько языков. Я хочу сделать это так, чтобы «Language Settings-Btn» находилось в открывающемся VC. Язык по умолчанию будет английский, но пользователь может перейти на другие языки в tableView, доступ к которому осуществляется с помощью этой кнопки.

Моя текущая попытка (и это, возможно, не самый умный способ сделать это) состоит в том, что я создал класс Realm с именем Language, а затем прикрепил кнопки ко всем ячейкам в LanguageSettingTableView. При нажатии одной из кнопок (языков) пользователь изменяет Language.diaryLanguage на то, что представляет собой нажатая кнопка.

Тогда я сел на заявление переключателя, например, мой welcomeScreenVC, где у меня сейчас четыре разных случая; Английский, испанский, датский, немецкий (только для начинающих).

Итак, я хочу установить выражение if (я полагаю?) Внутри viewWillAppear, в котором я заявляю: if Language.diaryLanguage == "English" -> Present case .english и т. Д. Но я не могу кажется, чтобы выяснить, как достичь этих различных случаев.

Вот мой соответствующий код в welcomeScreenVC:

import UIKit
import RealmSwift

enum LanguageMode {
case english
case spanish
case danish
case german
 }

class WelcomeScreen: UIViewController  {

var getStartedBtn = UIButton ()
var informationBtn = UIButton ()
var seeAllDiariesBtn = UIButton ()
var languageSettingsBtn = UIButton ()

var currentLanguage = Language()
var mode: LanguageMode = .english

private func modeUpdate() {
    switch mode {

    case .english:
        getStartedBtn.setTitle("Create new People Diary", for: .normal)
        informationBtn.setTitle("Read More", for: .normal)
        seeAllDiariesBtn.setTitle("See all People Diaries", for: .normal)
        languageSettingsBtn.setTitle("Language", for: .normal)

    case .danish:
        getStartedBtn.setTitle("Lav ny People Diary", for: .normal)
        informationBtn.setTitle("Læs Mere", for: .normal)
        seeAllDiariesBtn.setTitle("Se alle People Diaries", for: .normal)
        languageSettingsBtn.setTitle("Sprog", for: .normal)

    case .spanish:
        getStartedBtn.setTitle("Hace nuevo People Diary", for: .normal)
        informationBtn.setTitle("Lees Mas", for: .normal)
        seeAllDiariesBtn.setTitle("Mirra todos People Diaries", for: .normal)
        languageSettingsBtn.setTitle("Idiomas", for: .normal)

    case .german:
        getStartedBtn.setTitle("Bla bla Bla", for: .normal)
        informationBtn.setTitle("Bla bla bla", for: .normal)
        seeAllDiariesBtn.setTitle("Bla bla", for: .normal)
        languageSettingsBtn.setTitle("Bla bla", for: .normal)
    }
 }

override func viewWillAppear(_ animated: Bool) {
    self.navigationController?.setNavigationBarHidden(true, animated: animated)
    super.viewWillAppear(animated)

    if currentLanguage.diaryLanguage == "English" {
    // Then present case .english ...
    } else if currentLanguage.diaryLanguage == "Danish" {
        // Present case .danish ...
    } else if currentLanguage.diaryLanguage == "Spanish" {
        // Present case .spanish ...
    } else if currentLanguage.diaryLanguage == "German" {
        // Present case .german ...
    } else {
        // present .english (pr. default)
    }

    modeUpdate()
}

Надеюсь, кто-нибудь подскажет, как этого добиться. Спасибо заранее!

1 Ответ

0 голосов
/ 07 января 2019

Хотя я и разделяю рекомендацию iOSer о том, что локализация будет лучшим решением для реализации описанной вами функциональности ( см. Это руководство для хорошей отправной точки ), чтобы ответить на ваш конкретный вопрос о как использовать оператор switch, вам просто нужно обновить переменную до значения, связанного с делом, которое вы хотите выполнить.

enum Language {
    case english, french, german
}

var language: Language = .english

func generateGreeting() -> String {
    switch language {
        case .english:
            return "Hello!"

        case .french:
            return "Bonjour!"

        case .german:
            return "Guten Tag!"
    }
}

generateGreeting() // 'Hello!'

language = .french
generateGreeting() // 'Bonjour!'

language = .german
generateGreeting() // 'Guten Tag!'

Если ваш enum представляет значение определенного типа, например, в вашем примере, где String связан, вы можете вместо этого использовать его в качестве значения для каждого случая.

enum Language: String {
    case english = "English"
    case french = "French"
    case german = "German"
}

Language(rawValue: "English") // .english
...