Имеете дело с NIl?в UITableViewCell - PullRequest
0 голосов
/ 06 декабря 2018

Хорошо, после решения проблемы с «я» теперь я пытаюсь понять, почему я не могу развернуть результаты из моей MysqlDB.Приложение подключается, получает данные, а затем может показывать их.Проблема в том, что он не может распаковать.Здесь код

ViewController.swift

import UIKit
 class ViewController: UIViewController, UITableViewDataSource,     UITableViewDelegate, HomeModelProtocol {

//downloadItems
func itemsDownloaded(items: NSArray) {
    feedItems = items
    self.listTable.reloadData()
}

//link tV
@IBOutlet weak var listTable: UITableView!
//Proprietà
var feedItems: NSArray = NSArray()
var selectList : ListModel = ListModel()



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

//viewDidLoad
override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

    //set delegates and initialize a homeModel
    self.listTable.delegate = self
    self.listTable.dataSource = self

    let homeModel = HomeModel ()
    homeModel.delegate = self
    homeModel.downloadItems()
}


func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) ->UITableViewCell {
    let cellIdentifier : String = "BasicCell"
    let myCell: UITableViewCell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier)!

    //recupero food
    let item : ListModel = feedItems[indexPath.row] as! ListModel

    //reference alla label
    myCell.textLabel!.text = item.description

    return myCell
}}

ListModel.swift

import Foundation
class ListModel : NSObject {

//proprietà
var name: String?
var percentage: Int?
var other: String?
var id: Int?


override init(){
}

init(name: String, percentage: Int, other: String, id: Int){
    self.name = name
    self.percentage = percentage
    self.other = other
    self.id = id
}

//stampa oggetti
override var description: String{
    return "Name: \(name), Percentuale: \(String(describing: percentage)), Altro: \(other)"
}}

HomeModel.swift

import Foundation

protocol HomeModelProtocol: class {
    func itemsDownloaded(items: NSArray)
} 

class HomeModel: NSObject, URLSessionDataDelegate{
//proprietà
weak var delegate: HomeModelProtocol!
var data = Data()
let urlPath: String = "http://www.sake-house.net/webServices.php"

func downloadItems(){
    let url : URL = URL(string: urlPath)!
    let defaultSession = Foundation.URLSession(configuration: URLSessionConfiguration.default)
    let task = defaultSession.dataTask(with: url) {(data, response, error) in
        if error != nil{
            print("downloasd fallito")
        }else{
            print("Dati scaricati")
            parseJSON(data!)
        }
    }
    task.resume()
}} 
func parseJSON(_ data:Data){
var jsonResult = NSArray()

do{
    jsonResult = try JSONSerialization.jsonObject(with: data, options: JSONSerialization.ReadingOptions.allowFragments) as! NSArray
} catch let error as NSError{
    print (error)
}

var jsonElement = NSDictionary()
let listFoods = NSMutableArray()

for i in 0..<jsonResult.count {
    jsonElement = jsonResult[i] as! NSDictionary

    let listF = ListModel()

    if let name = jsonElement["Name"] as? String, let percentage = jsonElement["Percentage"] as? Int, let other = jsonElement["other"] as? String, let id = jsonElement["id"] as? Int{
        listF.name = name
        listF.percentage = percentage
        listF.other = other
        listF.id = id
    }
    listFoods.add(listF)

    //check listFoods
    DispatchQueue.main.async(execute: { () -> Void in self.delegate.itemsDownload(items: listFoods)}) <--------HERE

}}//fine func parseJSON

Проблема в этой строке

let myCell: UITableViewCell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier)!

"Поток 1: Неустранимая ошибка: неожиданно обнаружен ноль при развертывании необязательного значения"

В ViewController.swift.Если я удалю эту строку, она будет работать и покажет мне Имя: nil .

Ответы [ 2 ]

0 голосов
/ 07 декабря 2018

Итак, я попробовал, как сказал Ш_Хан.Я думаю, что что-то упустил или я сделал это неправильно вообще.Внутри Viecontroller.swift

class CellName:UITableViewCell {

}
@IBOutlet weak var listTable: UITableView!

, а затем

tableView.register(CellName.self, forCellReuseIdentifier:cellIdentifier)
let myCell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier) as! CellName

Теперь я могу что-то увидеть, но в результате я вижу "ноль"

0 голосов
/ 06 декабря 2018

Эта строка дает сбой

 let myCell: UITableViewCell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier)!

, так как вам нужно зарегистрировать ячейку для этого tableView, вам нужно создать пользовательскую ячейку, а затем использовать

let myCell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier) as! CellName

Зарегистрировать

tableView.register(CellName.self, forCellReuseIdentifier:cellIdentifier)

// или для xib

tableView.register(UINib(nibName: "xibname", bundle: nil), forCellReuseIdentifier: cellIdentifier)

class CellName:UITableViewCell {

   // outlets here 

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