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