Заполнение UIAlertController UIAlertActions на основе массива строк

#arrays #swift #uialertcontroller #uialertaction

#массивы #swift #uialertcontroller #uialertaction

Вопрос:

У меня есть массив строк под названием languages, и я хочу создать в UIAlertController столько UIAlertActions, сколько элементов в массиве. Я не знаю, насколько большим будет массив, поскольку пользователь может добавлять языки в массив, используя опцию добавления из того же UIAlertController.

loadLanguages () успешно загружает данные UserDefaults по умолчанию в массив languages, если существуют какие-либо существующие языки, которые либо были сохранены как 2 начальных языка при первой загрузке приложения и / или добавлены пользователем при последующем использовании приложения.

Опция добавления языка работает и сохраняется в userDfeaults (self.saveLanguages) и добавляется к массиву languages.

Однако я не уверен в создании параметров UIAlertAction для каждого языка, который находится в массиве languages. Я попытался выполнить цикл по массиву, чтобы сгенерировать каждый пункт меню, поскольку в массиве languages есть ответ относительно того, сколько UIAlertActions должно отображаться, но ничего не отображается.

После продолжительных поисков я не наткнулся ни на что, охватывающее это, но я уверен, что есть элегантный подход.

К вашему СВЕДЕНИЮ: languageChoiceButton объявлен как:

var languageChoiceButton = UIAlertAction()

 @objc func languageMenu(){

    loadLanguages()

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

    let addLanguage = UIAlertAction(title: "Add Language", style: .default, handler: { (action) -> Void in
        let ac = UIAlertController(title: "Add a language", message: nil, preferredStyle: .alert)

        ac.addTextField { textField in
            textField.placeholder = "New language"
        }
        let submitAction = UIAlertAction(title: "Add", style: .default) { [unowned self, ac] (action: UIAlertAction!) in
            self.newLanguage = ac.textFields?[0].text ?? ""
            print("newLanguage: (self.newLanguage)")
            self.languages.append(self.newLanguage)
            self.saveLanguages()
            self.loadLanguages()

        }
        ac.addAction(submitAction)
        ac.addAction(UIAlertAction(title: "Cancel", style: .cancel))

        self.present(ac, animated: true)
    })

    chooseLanguageController.addAction(addLanguage)

    for language in languages {
        languageChoiceButton = UIAlertAction(title: language.capitalized, style: .default, handler: { (action) -> Void in
            self.chosenLanguage = language
            self.title = self.chosenLanguage.capitalized
            print("Chosen language is: (self.chosenLanguage)")
            self.loadInitialValues()
            chooseLanguageController.addAction(self.languageChoiceButton)
        })
    }

    let cancel = UIAlertAction(title: "Cancel", style: .cancel)  {
        (action:UIAlertAction!) in
        print("Cancel button tapped")
    }
    chooseLanguageController.addAction(cancel)

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

Комментарии:

1. Я не уверен, чего вы собираетесь достичь, но хорошей практикой было бы использовать либо UIPickerView , либо UITableView вместо действий оповещения. При этом вы можете создать свой пользовательский контроллер просмотра и показать его как всплывающее окно

2. @Al___ Да, я думал об этом, так что спасибо, что подтолкнул меня в этом направлении!

Ответ №1:

Попробуйте создать массив при использовании определенных языков и после этого выполните цикл, чтобы добавить каждый из них в оповещения.

 @objc func languageMenu(){

    loadLanguages()

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

    let i = languages.count - 1

    for n in 0...i{
        chooseLanguageController.addAction(UIAlertAction(title:  arrayLanguage[n].language, style: .default, handler: { (action) in
                print(self. languages[n])
            }))
    }

    self.present(chooseLanguageController, animated: true, completion: nil)

}