Swift UICollectionView - 从另一个类添加/删除数据

时间:2017-07-14 22:59:10

标签: ios swift uicollectionview uicollectionviewcell

我首先执行了一个主视图控制器,看起来如下所示,

MainViewController

class MainViewController: UIViewController {
  var collectionView: UICollectionView!
  var dataSource: DataSource!

  SomeAction().call() {
    self.dataSource.insert(message: result!, index: 0)
  }
}

集合视图的数据源

class DataSource: NSObject, UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout  {

    var conversation: [messageWrapper] = []

    override init() {
        super.init()
    }

    public func insert(message: messageWrapper, index: Int) {
        self.conversation.insert(message, at: index)
    }

    func numberOfSections(in collectionView: UICollectionView) -> Int {
        return 1
    }

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

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let textViewCell = collectionView.dequeueReusableCell(withReuseIdentifier: "textViewCell", for: indexPath) as! TextCollectionViewCell
        let description = conversation[indexPath.row].description        
        textViewCell.textView.text = description

        return textViewCell
    }
}

因此,当执行MainViewController时,会在collectionview的数据源中添加一个完全正常的数据源。

问题 现在,我有另一个看起来像的类 的 SomeController

open class SomeController {
    let dataSource: DataSource = DataSource()

    public func createEvent() {
        self.dataSource.insert(message: result!, index: 1)
    }
}

当我从上面的控制器添加一些数据时,conversation为空,没有现有的一条记录并抛出Error: Array index out of range。我能理解这是因为我再次实例化了DataSource

  1. 如何在其他类中添加/删除数据?
  2. 这样做是最好的做法吗?
  3. 我可以将对话作为全局变量吗?

2 个答案:

答案 0 :(得分:0)

Datasource类已使用默认的nil值重新初始化,您必须将更新的类传递给下一个控制器才能访问其更新状态。

  1. 如何在其他类中添加/删除数据?

    • 您应该使用类Datasource:NSObject {
    • 您的集合视图委托您的viewcontroller类。
    • 在prepareForSegue
    • 中传递您的dataSource
  2. 这是最好的做法吗?

  3. 我可以将对话作为全局变量吗? 不,最好使用型号/ mvc风格。您的模型上的数据,ui在您的viewcontrollers上。

答案 1 :(得分:0)

您的初始计数似乎是1,但您在索引1处插入(超出索引) 使用self.dataSource.insert(message: result!, index: 0) insteaded

或使用append