我可以通过在iOS应用中使用API​​ Spotify来解决这个问题吗?

时间:2017-07-28 08:15:47

标签: ios swift alamofire spotify

我有这个错误:

  

在展开“可选”值时意外发现nil“

在这一行:vc.mainPreviewURL = posts[indexPath!].previewURL

我如何修复这个请问? 这是我的所有代码,提前谢谢;)

class TableViewController: UITableViewController {

    var posts = [post]()
    var names = [String]()
    var searchURL = "https://api.spotify.com/v1/search?q=Shawn+Mendes&type=track"
    var oAuthToken = "BQCvqHzNOHyHgUTKvw43PdXV4yZs9jHvdIPsn3XbXNE5Jbg0zwNrpfwh81VMeuK5LQeRel0djaJT1IyLa1T9YzQmDypC5LkMD5z_NDzeAWRcEvH4fMc_nn50X2R_i8a38AMrjfMS8qPNhGYoHjAe8sFvjBSwQOereRr2RrEbmXc8JMGq7-Aq-ttalp87DuCRVy8mt8wVt8Muenihus8hXrctT071x7he2j_eGHJSWp7WoA5fOyk9xhzkxU_p_3Hkab6x6rbYCM4SFX9WlDtb5h_jikfehT-15Mjol_PmnRYo9WPnaCLKTs3AOblDlNk"

    typealias JSONStandard = [String: AnyObject]

    override func viewDidLoad() {
        super.viewDidLoad()
        callAlamo(url: searchURL,token: oAuthToken)
    }

    func callAlamo(url : String,token: String){

        Alamofire.request(searchURL, method: .get, parameters: ["q":"Shawn Mendes", "type":"track"], encoding: URLEncoding.default, headers: ["Authorization": "Bearer "+oAuthToken]).responseJSON { response in
            self.parseData(JSONData: response.data!)
            print(response)
        }
    }


    func parseData(JSONData:Data){
        do {
            var readableJSON = try JSONSerialization.jsonObject(with: JSONData, options: .mutableContainers) as! JSONStandard
            print(readableJSON)
            if let tracks = readableJSON["tracks"] as? JSONStandard{
                if let items = tracks["items"] as? [JSONStandard] {
                    for i in 0..<items.count{
                        let item = items[i]
                        print(item)
                        let name = item["name"] as! String
                        let previewURL = item["preview_url"] as? String
                        if let album = item["album"] as? JSONStandard {
                            if let images = album["images"] as? [JSONStandard]{
                                let imageData = images [0]
                                let mainImageURL = URL(string: imageData["url"] as! String)
                                let mainImageData = NSData(contentsOf: mainImageURL!)
                                let mainImage = UIImage(data: mainImageData as! Data)
                                posts.append(post.init(mainImage: mainImage! ,name: name,previewURL: previewURL))
                                self.tableView.reloadData()
                            }
                        }
                    }
                }
            }
        }
        catch {
            print(error)
        }
    }
    override func prepare(for segue: UIStoryboardSegue,sender: Any?){
        let indexPath = self.tableView.indexPathForSelectedRow?.row
        let vc = segue.destination as! AudioVC
        vc.image = posts[indexPath!].mainImage
        vc.mainSongTitle = posts[indexPath!].name
        vc.mainPreviewURL = posts[indexPath!].previewURL
    }
}

2 个答案:

答案 0 :(得分:0)

Swift 3X 改变这一行......

override func prepare(for segue: UIStoryboardSegue,sender: Any?){
if let indexPath = self.tableView.indexPathForSelectedRow{
    let vc = segue.destination as! AudioVC
    vc.image = posts[indexPath.row].mainImage
    vc.mainSongTitle = posts[indexPath.row].name
    vc.mainPreviewURL = posts[indexPath.row].previewURL
 }
}

答案 1 :(得分:0)

您应该声明您的segue手册并从didSelectRowAt函数内部调用它。

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    self.performSegue(withIdentifier: "yourSegue",sender: indexPath.row)
}

override func prepare(for segue: UIStoryboardSegue,sender: Any?){
    if let segue.identifier == "yourSegue" {
        let vc = segue.destination as! AudioVC
        let index = sender as! Int
        vc.image = posts[index].mainImage
        vc.mainSongTitle = posts[index].name
        vc.mainPreviewURL = posts[index].previewURL
    }
}