Симулятор падает при загрузке данных из plist в UITableView - PullRequest
1 голос
/ 08 октября 2019

Я хочу показать содержание plist в виде таблицы, но Xcode потерпел крах.

Это мой код для получения данных plist:

    var tableData = [String]()

        override func viewDidLoad() {
            super.viewDidLoad()

            self.tblMain.delegate = self
            self.tblMain.dataSource = self


            let path = Bundle.main.path(forResource: "Province", ofType: "plist")!
            let dict = NSDictionary(contentsOfFile: path)

            tableData = dict!.object(forKey: "root") as! [String]
        }


       func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
            let cell = tableView.dequeueReusableCell(withIdentifier: "cell") as! CountryNameCell
            cell.lblCountryName.text = tableData[indexPath.row]
            return cell
        }

Это мой файл plist:

enter image description here

Ответы [ 2 ]

1 голос
/ 08 октября 2019

Вам нужно

let path = Bundle.main.path(forResource: "Province", ofType: "plist")! 
tableData  = NSArray(contentsOfFile: path) as! [String]
0 голосов
/ 08 октября 2019

Корневой объект - это массив, в котором нет ключа root (даже не в верхнем регистре R).

В Swift вы не поощряетесьот использования NSArray / NSDictionary API для чтения и записи списков свойств. Настоятельно рекомендуемый API: PropertyListSerialization

let url = Bundle.main.url(forResource: "Province", withExtension: "plist")!
do {
    let data = try Data(contentsOf: url)
    tableData = try PropertyListSerialization.propertyList(from: data, format: nil) as! [String]
} catch {
    print(error)
}

Вы можете даже удалить блок do - catch и try!, считывая данные, поскольку файл находится в комплекте приложений, который нельзя изменить во время выполнения. Авария выявляет ошибку design , которая может быть немедленно исправлена.

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