【问题标题】:Swift 3, Alamofire 4, JSON Dictionary: Only displaying last JSON entrySwift 3、Alamofire 4、JSON 字典:仅显示最后一个 JSON 条目
【发布时间】:2016-10-13 05:41:05
【问题描述】:

由于某种原因,我的代码只显示 JSON 文件中的最后一个条目...没有错误,只是没有正确显示 UICollectionView 中的所有集合。

class vcWatch: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource {

@IBOutlet weak var myActivityIndicator: UIActivityIndicatorView!
@IBOutlet weak var myCollectionView: UICollectionView!

var images:[String] = [] // @IBOutlet weak var imageCell: UIImageView!
var lableTitles:[String] = [] // @IBOutlet weak var labelCell: UILabel!
let pageURL = "http://alifetouched.com/lib/videos.json.php"

override func viewDidLoad() {
    super.viewDidLoad()
    loadImages()
}

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return images.count
}

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

    let myCell:cvCell = collectionView.dequeueReusableCell(withReuseIdentifier: "VideoCell", for: indexPath) as! cvCell

    myCell.labelCell.text = self.lableTitles[indexPath.row]

    let imageString = self.images[indexPath.row]
    let imageUrl = NSURL(string: imageString)
    let imageData = NSData(contentsOf: imageUrl! as URL)

    if(imageData != nil){
        myCell.imageCell.image = UIImage(data: imageData! as Data)
    }

    return myCell
}

func collectionView(_ collectionView: UICollectionView, didDeselectItemAt indexPath: IndexPath){
    print("User Tapped: \(indexPath.row)")
}

func loadImages() {
    myActivityIndicator.isHidden = false
    myActivityIndicator.startAnimating()

    Alamofire.request(pageURL)
        .validate()
        .responseJSON { (response) in

            guard response.result.isSuccess else {
                print("Error with response: \(response.result.error)")
                return
            }

            guard let dict = response.result.value as? Dictionary <String,AnyObject> else {
                print("Error with dictionary: \(response.result.error)")
                return
            }

            guard let dictData = dict["VideoJSON"] as? [Dictionary <String,AnyObject>] else {
                print("Error with dictionary data: \(response.result.error)")
                return
            }

            for videos in dictData {
                self.myActivityIndicator.isHidden = true
                self.myActivityIndicator.stopAnimating()

                self.images = [videos["icon_url"] as! String]
                self.lableTitles = [videos["title"] as! String]
                self.myCollectionView.reloadData()
            }
            return
    }
}
}

我知道我只是想不通...提前感谢您的宝贵时间。

【问题讨论】:

    标签: json swift uicollectionview swift3 alamofire


    【解决方案1】:

    问题在于您的 for 循环内部,您需要将对象附加到数组中,而不是使用单个对象初始化数组,还需要在所有对象之后在 for 循环之外重新加载 collectionView添加在数组中而不是循环内。此外,您还需要将myActivityIndicator 放在 for 循环之前或循环之后而不是在循环内,因为它会多次执行相同的代码而无需这样做。

    self.myActivityIndicator.isHidden = true
    self.myActivityIndicator.stopAnimating()
    for videos in dictData {
    
        self.images.append(videos["icon_url"] as! String)
        self.lableTitles.append([videos["title"] as! String)
    }
    self.myCollectionView.reloadData()
    

    注意:一个建议不是维护两个不同的[String] 类型的数组,而是需要主[[String: Any]] 类型的单个数组并在您的collectionView 方法中使用该数组,例如myCell.labelCell.text = self.dicArr[indexPath.row]["title"] as? String

    【讨论】:

    • 哇!快速而准确......只需使用更新运行它,它工作得很好。非常感谢您的宝贵时间 - 完美答案。我点击了评分,但我相信我未满 15 岁才能给你打分。请给 Nirav D 打分——他的解决方案是正确的。
    • @user3144951 欢迎朋友 :) 另请查看编辑后的答案 :)
    • 今晚回家后我会试试 self.dicarr。不幸的是,我以前没有正确设置字典..但我准备迎接挑战。我需要在 cellforitemat 函数或加载函数中进行设置吗?抱歉,我真的很想了解这一点,这样我就可以在将来使用这种了解......并支付它。谢谢。
    • 嗯 - 尝试了我认为是你所说的内容,但老实说,我不知道在哪里添加什么......任何进一步的帮助都会有所帮助 - 谢谢。
    • 实际上,为了让您相信 Nirav,我会为解决方案添加另一个问题。,
    【解决方案2】:

    首先创建数组以获取 alamofire 响应。而不是将响应名称 "VideoJSON" 数组添加到您的数组中 而不是在 numberofiteminsection 中计算你的数组 而不是从您之前添加的那个数组中获取 url

    你的这个方法只得到最后一个条目

    for videos in dictData {
                self.myActivityIndicator.isHidden = true
                self.myActivityIndicator.stopAnimating()
    
                self.images = [videos["icon_url"] as! String]
                self.lableTitles = [videos["title"] as! String]
                self.myCollectionView.reloadData()
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-07-18
      • 2017-04-03
      • 2020-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多