Singleton类不使用Swift更新UICollectionViewCell上的数据

时间:2017-11-20 01:07:42

标签: ios swift singleton

我不确定这是否是正确的说法,但我一直在尝试将数据传输到ColectionViewCell,但它似乎并没有显示所有这些。这个问题来自Cards are not displaying different data. Koloda/Yalantis。看来该框架需要一种不同的方法将数据应用于索引,但我不知道如何实现这一点。

以下是我班级的表现:

import SwiftyJSON

class Person {

    var firstName: String?


    init(json: JSON) {
        self.firstName = json["first_name"].stringValue
    }
}

这是我管理Person类的单身人士:

class PersonManager {

    static let shared = PersonManager()
    private init() {}

    var persons = [Person]()

    func removeAll() {
        persons.removeAll()
    }

    func addPerson(_ person: Person) {
        persons.append(person)
    }
}

以下是我尝试在 获取初始化附加之后调用数据的方式:

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
  let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath)

  let person = PersonManager.shared.persons[kolodaView.currentCardIndex]
  //Returns the first persons first name as it is supposed to
  cell.textLabel?.text = person.firstName
}

数据存在,因为它计算了我的数据库中的人数。但它继续为所有卡片返回第一个人。

更新

使用Firebase我正在获取用户数据,然后将其添加为:

func fetchUser() {
    let databaseRef = Database.database().reference(withPath: "users")
    databaseRef.observe( .value, with: { (snapshot) in
        for child in snapshot.children {
            guard let snapshot = child as? DataSnapshot else { continue }
            let person = Person(from: snapshot)
            self.person = person
            PersonManager.shared.addPerson(person)
        }
        self.kolodaView.reloadData()
    })
}

3 个答案:

答案 0 :(得分:0)

尝试更改您的功能,如下所示:

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
  let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath)

  let person = PersonManager.shared.persons[indexPath.row]
  //Returns the first persons first name as it is supposed to
  cell.textLabel?.text = person.firstName
}

问题是您的变量kolodaView.currentCardIndex始终为0,它永远不会显示其他结果,而是集合中的第一个。

indexPath.row用于控制您需要的索引。

答案 1 :(得分:0)

可能你应该尝试indexPath.item,而不是row(那是UITableView)

确保

  

let cell = collectionView.dequeueReusableCell(withReuseIdentifier:   “cell”,用于:indexPath)

细胞不是零。你应该打印每个单元格。如果它是零,你不能将你的数据放在零UICollectionViewCell中。 所以添加代码

  

if(cell == nil)cell = [UICollectionViewCell new];

答案 2 :(得分:0)

我想:

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

在cellForItem中,您应该使用indexPath.row而不是kolodaView.currentCardIndex,除非这确实是您需要的(非常奇怪)。 如果是这样,请检查PersonManager是否每次都附加相同的Person,这样每次只能为您提供第一个项目。仔细检查一下,因为没有其他原因