调用 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()