【问题标题】:Can I fix this with the using of API Spotify in iOS app?我可以通过在 iOS 应用程序中使用 API Spotify 来解决这个问题吗?
【发布时间】:2017-07-28 08:15:47
【问题描述】:

我有这个错误:

在展开可选值时意外发现 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
    }
}

【问题讨论】:

  • 不要强制解包该值,除非您 100% 确定它会有一个值。 indexPath 为零,这就是您收到错误的原因。你的segue是从哪里调用的? indexPath 在哪里定义?此外,在使用表视图时,如果要访问行的索引,请使用 indexPath.row 而不仅仅是 indexPath
  • 覆盖 func tableView(_ tableView:UITableView,numberOfRowsInSection section: Int) -> Int { return posts.count } @DávidPásztor override func tableView(_ tableView: UITableView,cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "Cell") 让 mainImageView = cell?.viewWithTag(2) as! UIImageView mainImageView.image = posts[indexPath.row].mainImage 让 mainLabel = cell?.viewWithTag(1) 为! UILabel mainLabel.text = posts[indexPath.row].name 返回单元格! }
  • 请在您的问题中以代码格式包含该问题,在评论中这样不可读。

标签: ios swift alamofire spotify


【解决方案1】:

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
 }
}

【讨论】:

  • 我现在有这个错误:“无法使用索引路径类型为'[post]'的值下标......这是什么意思?
  • @Raksha indexPath 的类型为 IndexPath,因此它不能用于索引数组。你必须使用indexPath.row 你也不需要强制解开indexPath,因为它是一个非可选值。
  • @DávidPásztor thanx
  • @Luigis94 请您在 AudioVC 中添加帖子对象类型数组。并发送数据。
【解决方案2】:

您应该声明您的 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
    }
}

【讨论】:

    猜你喜欢
    • 2014-09-26
    • 1970-01-01
    • 2016-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-24
    • 2011-07-16
    • 1970-01-01
    相关资源
    最近更新 更多