У меня есть два NSCombobox в одном ViewController.Один для страны, а другой для города.У меня есть текстовые файлы с названием страны, которая включает города с соответствующей широтой и долготой.Например: текстовый файл США содержит 17456 списков городов.Я хочу заселить города по названию своей страны.Но выпадающий список зависает при загрузке большого количества городов.Тем более, что при поиске городов в выпадающем списке приложение зависает из-за большого потребления памяти.Мой текстовый файл выглядит так:
214 Северный храмовый кондоминиум, Юта, Солт-Лейк, 40N46'19,111W54'01,1,4265, L
Трейлерный корт A и B номер один, MT, Hill, 48N33'09,109W40'50,1 ,,
Трейлерный корт A и B номер два, MT, Hill, 48N33'00,109W41'00, 1 ,,
Это то, что я пробовал.
let countryList = ["USA","Germany","Canada","Finland"]
var citiesList: [String] = []
var counter = 0
var countryOrCities = ""
@IBOutlet var country: NSComboBox!
@IBOutlet var city: NSComboBox!
override func viewDidLoad() {
super.viewDidLoad()
country.usesDataSource = true
country.dataSource = self
city.usesDataSource = true
city.dataSource = self
country.stringValue = "USA"
citiesList = readCitiesFromCountry(country: "USA")
}
func readCitiesFromCountry(country: String) -> [String] {
var flag = true
var returnedCitiesList: [String] = []
if let path = Bundle.main.path(forResource: country, ofType: "txt") {
guard let streamReader = StreamReader(path: path) else {fatalError()}
defer {
streamReader.close()
}
while flag {
if let nextLine = streamReader.nextLine() {
returnedCitiesList.append(nextLine)
} else {
flag = false
}
}
} else {
fatalError()
}
return returnedCitiesList
}
func numberOfItems(in comboBox: NSComboBox) -> Int {
switch comboBox {
case country:
counter = countryList.count
case city:
counter = citiesList.count
default:
break
}
return counter
}
func comboBox(_ comboBox: NSComboBox, objectValueForItemAt index: Int) -> Any? {
switch comboBox {
case country:
countryOrCities = countryList[index]
case city:
countryOrCities = citiesList[index]
default:
break
}
return countryOrCities
}
func comboBoxSelectionDidChange(_ notification: Notification) {
let comboBox = (notification.object as? NSComboBox)!
if comboBox == country {
citiesList = readCitiesFromCountry(country: country.stringValue)
city.reloadData()
} else {
print("Value changed by other")
}
}
Вместо dropDownSize, чтобы быть конкретным числом, я хочу, чтобы он прочитал все количество городов так,что поиск городов для выбранной страны не ограничен.Класс StreamReader из Считывание файла / URL построчно в Swift
То, что я пытаюсь достичь, выглядит так: https://www.youtube.com/watch?v=QrdA-zbW4_o&feature=youtu.be>