调用 API 时不显示 UICollectionView 单元格

Posted

技术标签:

【中文标题】调用 API 时不显示 UICollectionView 单元格【英文标题】:UICollectionView cells are not displaying when API is called 【发布时间】:2015-12-28 08:56:24 【问题描述】:

我正在开发一个简单的应用程序,它会从 URL 中获取详细信息并检索到 UICollectionViewCell。我参考了很多 tuts',最后我使用了类似于 REST API。问题是,当它构建时,没有发现任何问题,而且UICollectionView 单元格变为空。

视图控制器:

import UIKit
class ImageViewController: UIViewController, NSURLConnectionDelegate, UICollectionViewDelegate, UICollectionViewDataSource 

var items = NSMutableArray()

@IBOutlet var colView: UICollectionView!

override func viewDidLoad()

    super.viewDidLoad()
    self.colView!.registerClass(NSClassFromString("ImageCollectionViewCell"),forCellWithReuseIdentifier:"collectionView");
    addUrlData()


func addUrlData()

        ImageManager.sharedInstance.getRandomUser  json in

        let results: JSON = json["share"][2]["data"]

        for(key, subJson) in results
        
            let user: NSDictionary = subJson["shares"].object as! NSDictionary
            self.items.addObject(user)
            dispatch_async(dispatch_get_main_queue(),
                colView?.reloadData()
            )
          
    


func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int 
    //return self.items.count;
    return 10





func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell 
    let row = indexPath.row
    var cell: ImageCollectionViewCell = collectionView.dequeueReusableCellWithReuseIdentifier("collectionView", forIndexPath: indexPath) as! ImageCollectionViewCell

    if cell == []
    
        print("UIColViewCell Error")
    

    let user:JSON = JSON(self.items[row])
    let picURL = "http://buddysin.aumkiiyo.com/thumb/" + user["mid"]["image"].string! + "/" + " \(245)"   // Image URL
    print(picURL)
    let url = NSURL(string: picURL)
    if let data = NSData(contentsOfURL: url!)
    
        cell.imageLabel?.text = user["name"].string
        cell.imageView?.image = UIImage(data: data)

        //   let shareItem: Shares = ImageManager.sharedInstance.imageListArray[row]
        cell.backgroundColor = UIColor.blackColor()
    
    //  cell.imageLabel?.text = String(shareItem.latitude!)
    return cell




图像管理器:

typealias ServiceResponse = (JSON, NSError?) -> Void

class ImageManager: NSObject 
    static let sharedInstance = ImageManager()

    let baseURL = "http://buddysin.aumkiiyo.com/api/nearby/share"

    func getRandomUser(onCompletion: (JSON) -> Void) 
        let route = baseURL
        makeHTTPGetRequest(route, onCompletion:  json, err in
           onCompletion(json as JSON)     )

    

    func makeHTTPGetRequest(path: String, onCompletion: ServiceResponse) 
        let request = NSMutableURLRequest(URL: NSURL(string: path)!)

        let session = NSURLSession.sharedSession()

        let task = session.dataTaskWithRequest(request, completionHandler: data, response, error -> Void in
            let json:JSON = JSON(data: data!)

            onCompletion(json, error)
            if error != nil
                
                    print("***** NSUrlSession error=\(error)")
                    return
            

            //You can print out response object
            print("******** Response object = \(response)")

            //Print out response body
            let responseString = NSString(data: data!, encoding: NSUTF8StringEncoding)
            print("******** Response body = \(responseString)")

        )
        task.resume()
    
    //MARK: Perform a POST Request
    func makeHTTPPostRequest(path: String, body: [String: AnyObject], onCompletion: ServiceResponse) 
        //var err: NSError?
        let request = NSMutableURLRequest(URL: NSURL(string: path)!)
        // Set the method to POST
        request.HTTPMethod = "POST"

        // Set the POST body for the request
        do 
            request.HTTPBody = try NSJSONSerialization.dataWithJSONObject(body, options: [])
            let session = NSURLSession.sharedSession()
            let task = session.dataTaskWithRequest(request, completionHandler: data, response, error -> Void in
                let json:JSON = JSON(data: data!)
                onCompletion(json, error)
                if error != nil
                
                    print("***** NSUrlSession error=\(error)")
                    return
                

         //       //You can print out response object
           //     print("******** Response object = \(response)")

                //Print out response body
                let responseString = NSString(data: data!, encoding: NSUTF8StringEncoding)
                print("******** Response body = \(responseString)")


            )
            task.resume()
         catch 
            print("error:\(error)")
        
    

此应用程序的库是:SwiftyJSON。谁能帮我解决这个问题?

【问题讨论】:

在队列外尝试 colView?.reloadData() 和 for 循环。 您似乎没有设置collectionView数据源或明确委托代码。您介意确认您是否通过界面生成器完成此操作吗? 感谢您的建议。我只通过界面生成器完成了.. 我应该在哪里使用 colview?.reloaData() 使用 for 循环 【参考方案1】:

首先,我没有看到您设置数据源和委托。

试试

self.colView!.dataSource = self // dataSource delegate
self.colView!.delegate = self  // UICollectionView delegate

其次,您不必每次都致电reloadData()。您只需在数据准备就绪时调用它,它就会重新加载所有数据。

另一件事是,确保JSON(self.items[row]) 在调用cellForItemAtIndexPath 时有数据。如果您的 HTTP 请求是异步的,请在您的完成处理程序中调用 reloadData,如果没有发生错误,请在 onCompletion(json, error) 中调用。

【讨论】:

我有一个疑问..我使用了 makeHTTPGetRequest 和 makeHTTPPostRequest 但我只调用了 get 请求.. 那么 post 方法的目的是什么,我也根据你的建议更改代码它显示输出由于身份验证失败 您应该检查身份验证失败的原因。 先不说http请求了,这个问题不说了。假设您启动一个 HTTP 请求并获得它的响应,其中包含有效数据。通常你会有一个successHandler,如果你得到响应并且数据是有效的,你应该在successHandler中调用reloadData。我只是举一个例子,也许你可以检查onCompletion(json, error) 是否可以完成这项工作。如果没有,那么您应该在收到数据后找到一个合适的地方拨打reloadData。如果您遇到有关 HTTP 协议和身份验证问题的问题,请提出另一个问题。

以上是关于调用 API 时不显示 UICollectionView 单元格的主要内容,如果未能解决你的问题,请参考以下文章

为啥观察 LiveData 时不调用 onChanged()

AWS Api Gateway 仅在 OPTIONS 调用时不响应 CORS 标头

Firebase 云消息在超出窗口焦点时不显示通知

使用python抓取百度搜索结果时不成功,怎么回事?

调用 add() 方法时不显示片段

iOS UITableView 搜索时不重新加载数据