UITableView错误,Swift,JSON

时间:2018-03-15 04:56:43

标签: json swift uitableview

我正在Swift学习商业应用课程,但我在运行代码时遇到了问题。我想我已经有了所有正确的代码来运行它。我有一个JSON文件,我必须导入到应用程序并将数据从json文件推送到tableView。 “func tableView”中出现了一些问题,但我无法弄明白。任何帮助表示赞赏:)

I added a screenshot of my code, as well as the main.storyboard

import UIKit

struct Movie : Decodable {
    let MOVIENAME : String
    let DIRECTORNAME : String
}

class ViewController: UIViewController, UITableViewDataSource,
UITableViewDelegate {
    //indicates this is an array of the structure 'Movie'
    var movies = [Movie]()

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return movies.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) ->
        UITableViewCell {
            let myCell = movieTableView.dequeueReusableCell(withIdentifier:
                "movieTable")
            myCell?.textLabel?.text = movies[indexPath.row].MOVIENAME
            myCell?.detailTextLabel?.text = movies[indexPath.row].DIRECTORNAME
            return myCell!
    }

    @IBOutlet weak var movieTableView: UITableView!

    override func viewDidLoad() {
        super.viewDidLoad()

        // construct path to the file, this tells the system the name of the file and the file type JSON
        let path = Bundle.main.path(forResource: "movies", ofType: "json")
        let url = URL(fileURLWithPath: path!) //creating url of the file, add "!" to unwrap the path

        do {
            //'try" is a security measure that basically says, if we dont get successfully create data through the url
            let data = try Data(contentsOf: url)
            self.movies = try JSONDecoder().decode([Movie].self, from: data)

            for eachMovie in self.movies {
                print(eachMovie.MOVIENAME)
            }
        } catch {
            print("JSON Error.")
        }

        movieTableView.delegate = self
        movieTableView.dataSource = self
    }
}

3 个答案:

答案 0 :(得分:0)

第1点

从代码和屏幕截图看,你看起来已经设置了不同于代码中使用的单元格标识符(猜猜!!)。因此,单元格返回nil,应用程序将崩溃。

let myCell = movieTableView.dequeueReusableCell(withIdentifier: 
"movieTable")

因此,请确保故事板中的单元格标识符为movieTable,如代码中所示。

第2点

第二点是您在代码textLabeldetailTextLabel中使用了单元格的默认标签。在故事板中,它显示您已设置自定义标签。哪些无处可用。因此,根据您的代码,故事板中的标签未被使用。因此,删除该表并将单元格样式设置为SubTitle以在代码下方使用。

myCell?.textLabel?.text = movies[indexPath.row].MOVIENAME
myCell?.detailTextLabel?.text = movies[indexPath.row].DIRECTORNAME

enter image description here

第3点

如果要以自定义方式在单元格中使用标签,可以创建自定义类的tableview单元格。 To make custom UITableViewCell

答案 1 :(得分:0)

您是否使用 UITableViewCell 标识符注册了 UITableView ?在viewDidLoad()上,输入并尝试

YOUR_TABLE_VIEW.register(UITableViewCell.classForCoder(), forCellReuseIdentifier: "movieTable")

正如@technerd所说,确保故事板中的单元格标识符是movieTable,就像在代码中一样。

希望这有帮助。

答案 2 :(得分:0)

1>  您需要检查您的小区标识符。在故事板中设置得当吗? 2>  我认为你必须在填写“[电影]”后重新加载你的桌面视图。