簡體   English   中英

無法將類型 (0x10ca9be10) 的值轉換為“NSString”(0x7fff86d8bbb0)

[英]Could not cast value of type (0x10ca9be10) to 'NSString' (0x7fff86d8bbb0)

大家下午好。 盡管我們正在經歷這種情況,但我希望你做得很好。

我告訴你我的問題。 我試圖將一系列數據保存在一個數組中,這些數據是通過 JSON 從 tableView 中選擇的。 也就是說,tableView 顯示了一些可供選擇的數據,被選中的那些我想將它們保存在一個數組中,但是當我在 tableView 中選擇一個數據時,我的應用程序崩潰並向我顯示了一個斷點“線程 1:信號 SIGABRT

在控制台中,我得到了這個:無法將“MallConcierge.DetallesIntereses”(0x10ca9be10)類型的值轉換為“NSString”(0x7fff86d8bbb0)。

我希望你能幫助我,我附上了我下載數據的類,細節和我連接 tableView 的類。

InteresesModelo.swift (在這個類中是我下載 JSON 數據的地方)

import UIKit

protocol InteresesModeloProtocol: class{
    func interesesDownload (interest: NSArray)
}

class InteresesModelo: NSObject {
    
    weak var delegate: InteresesModeloProtocol!
    
    let urlPath = "http://localhost:8888/mallconcierge/API-movil/interests.php"
    
    func interestDownload(){
        
        let url: URL = URL(string: urlPath)!
        let defaultSession = Foundation.URLSession(configuration: URLSessionConfiguration.ephemeral)
        URLCache.shared.removeAllCachedResponses()
        let task = defaultSession.dataTask(with: url){
            (data, response, error) in
            if error != nil{
                
                print("Error al descargar datos")
                
            }else{
                
                print("Datos descargados")
                self.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 detalles = NSMutableArray()
        
        for i in 0 ..< jsonResult.count{
            
            jsonElement = jsonResult[i] as! NSDictionary
            let detalle = DetallesIntereses()
            
            let idInteres = jsonElement["idInteres"]
            let nombreInteres = jsonElement["interesNombre"]
            
            detalle.idInteres = idInteres as? String
            detalle.nombreInteres = nombreInteres as? String
            
            detalles.add(detalle)
            
        }
        
        DispatchQueue.main.async(execute: { ()-> Void in
            
            self.delegate.interesesDownload(interest: detalles)
        })
            
        
    }

}

詳細信息Intereses.swift

import UIKit

class DetallesIntereses: NSObject {
    
    var idInteres: String?
    var nombreInteres: String?
    
    override init() {
        
    }
    
    init(idInteres: String, nombreInteres:String) {
        
        self.idInteres = idInteres
        self.nombreInteres = nombreInteres
        
    }
    
    override var description: String{
        
        return "idInteres: \(idInteres), nombreInteres: \(nombreInteres)"
        
    }

}

興趣視圖控制器.swift

import UIKit

class InteresesViewController: UIViewController, UITableViewDelegate, UITableViewDataSource,   InteresesModeloProtocol {
    
    var selectIntereses = [String]()
    
    var feedInterests: NSArray = NSArray()
    
   // var selectInterests: DetallesIntereses = DetallesIntereses()
    
    var items=[String]()
    
    @IBOutlet var listaInteresesTableView: UITableView!

    func interesesDownload(interest: NSArray) {
        
        feedInterests = interest
        self.listaInteresesTableView.reloadData()
        
    }
    
    
    override func viewDidLoad() {
        
        self.listaInteresesTableView.isEditing = true
        self.listaInteresesTableView.allowsMultipleSelectionDuringEditing = true

        self.listaInteresesTableView.delegate = self
        self.listaInteresesTableView.dataSource = self
        
        let interesesModelo = InteresesModelo()
        interesesModelo.delegate = self
        interesesModelo.interestDownload()
        
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return feedInterests.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        
        let cell = tableView.dequeueReusableCell(withIdentifier: "celInterests", for: indexPath) as! InteresesTableViewCell
        
        let interest: DetallesIntereses = feedInterests[indexPath.row] as! DetallesIntereses
        
        cell.lblNombreIntereses!.text = interest.nombreInteres
        
        return cell
        
    }
    
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        

        
        self.selectDeselectCell(tableView: listaInteresesTableView, indexPath: indexPath)
        print("Seleccionado")
        
    }
    
    func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
        self.selectDeselectCell(tableView: listaInteresesTableView, indexPath: indexPath)
        print("Deseleccionado")
    }
    
    func selectDeselectCell(tableView: UITableView, indexPath: IndexPath){
        self.selectIntereses.removeAll()
        
        if let arr = listaInteresesTableView.indexPathsForSelectedRows{
     
            
            for index in arr{
                selectIntereses.append(feedInterests[indexPath.row] as! String)
            }
        }
        print(selectIntereses)
    }
    
    @IBAction func seleccionarIntereses(_ sender: Any){
        
        print(selectIntereses)

    }
    
    /*
    // MARK: - Navigation

    // In a storyboard-based application, you will often want to do a little preparation before navigation
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        // Get the new view controller using segue.destination.
        // Pass the selected object to the new view controller.
    }
    */

}

JSON

[
{
    "idInteres": "1",
    "interesNombre": "Moda Mujer"
},
{
    "idInteres": "3",
    "interesNombre": "Moda Hombre"
},
{
    "idInteres": "4",
    "interesNombre": "Belleza"
},
{
    "idInteres": "5",
    "interesNombre": "Relojes y Joyería"
},
{
    "idInteres": "6",
    "interesNombre": "Hogar/Interiorismo"
},
{
    "idInteres": "7",
    "interesNombre": "Gastronomía"
},
{
    "idInteres": "8",
    "interesNombre": "Entretenimiento"
},
{
    "idInteres": "9",
    "interesNombre": "Wellness"
}

]

我希望你能幫助我,請。 我謝謝大家

這里發生了很多小事情。 當我使用//<-- Here進行編輯時,我試圖突出顯示。

到目前為止,最大的問題是使用非類型化的 Objective-C NSArray而不是使用類型化的 Swift 數組。 通過切換到那個,你可以獲得有用的類型錯誤。

我不得不對你想要做什么做一些假設,但這應該能讓你開始。

我大部分時間都保留了原始 JSON 解碼,但我強烈建議您考慮使用Codable而不是JSONSerialization除非您有令人信服的理由不這樣做。


protocol InteresesModeloProtocol : AnyObject {
    func interesesDownload (interest: [DetallesIntereses]) //<-- Here
}

class InteresesModelo: NSObject {
    
    weak var delegate: InteresesModeloProtocol!
    
    let urlPath = "http://localhost:8888/mallconcierge/API-movil/interests.php"
    
    func interestDownload(){
        
        let url: URL = URL(string: urlPath)!
        let defaultSession = Foundation.URLSession(configuration: URLSessionConfiguration.ephemeral)
        URLCache.shared.removeAllCachedResponses()
        let task = defaultSession.dataTask(with: url){
            (data, response, error) in
            if error != nil{
                
                print("Error al descargar datos")
                
            }else{
                
                print("Datos descargados")
                self.parseJSON(data!)
                
            }
        }
        task.resume()
        
    }
    
    func parseJSON(_ data:Data){
        
        var jsonResult = [[String:String]]()
        do{
            jsonResult = try JSONSerialization.jsonObject(with: data, options: JSONSerialization.ReadingOptions.allowFragments) as! [[String : String]]
        }catch let error as NSError{
            print(error)
        }
        
        let detalles = jsonResult.map { jsonElement -> DetallesIntereses in
            let detalle = DetallesIntereses(idInteres: jsonElement["idInteres"], nombreInteres: jsonElement["interesNombre"])
            return detalle
        }
        
        DispatchQueue.main.async {
            self.delegate.interesesDownload(interest: detalles)
        }
            
        
    }

}


struct DetallesIntereses { //<-- Here -- no reason for this to be an `NSObject`
    var idInteres: String?
    var nombreInteres: String?
}


class InteresesViewController: UIViewController, UITableViewDelegate, UITableViewDataSource,   InteresesModeloProtocol {
    
    var selectIntereses = [DetallesIntereses]()   //<-- Here
    
    var feedInterests: [DetallesIntereses] = []  //<-- Here
    
    var items = [String]()
    
    @IBOutlet var listaInteresesTableView: UITableView!

    func interesesDownload(interest: [DetallesIntereses]) { //<-- Here
        feedInterests = interest  //<-- Here
        self.listaInteresesTableView.reloadData()
    }
    
    
    override func viewDidLoad() {
        
        self.listaInteresesTableView.isEditing = true
        self.listaInteresesTableView.allowsMultipleSelectionDuringEditing = true

        self.listaInteresesTableView.delegate = self
        self.listaInteresesTableView.dataSource = self
        
        let interesesModelo = InteresesModelo()
        interesesModelo.delegate = self
        interesesModelo.interestDownload()
        
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return feedInterests.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        
        let cell = tableView.dequeueReusableCell(withIdentifier: "celInterests", for: indexPath) as! InteresesTableViewCell
        
        let interest: DetallesIntereses = feedInterests[indexPath.row]  //<-- Here
        
        cell.lblNombreIntereses!.text = interest.nombreInteres
        
        return cell
        
    }
    
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        self.selectDeselectCell(tableView: listaInteresesTableView, indexPath: indexPath)
        print("Seleccionado")
        
    }
    
    func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
        self.selectDeselectCell(tableView: listaInteresesTableView, indexPath: indexPath)
        print("Deseleccionado")
    }
    
    func selectDeselectCell(tableView: UITableView, indexPath: IndexPath){
        self.selectIntereses.removeAll()
        
        selectIntereses.append(feedInterests[indexPath.row]) //<-- Here
        print(selectIntereses)
    }
    
    @IBAction func seleccionarIntereses(_ sender: Any){
        
        print(selectIntereses)

    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM