2017-08-15 70 views
2

我有這個功能在我的SWIFT代碼斯威夫特運行功能的CollectionView的功能

func myFunc(){ 
    let jsonData2 = try JSONSerialization.jsonObject(with: data, options: []) as! [[String: Any] 
    self.comments = jsonData2 
    } 

而且在的CollectionView的numberOfItemsInSection功能我有這個

return comments.count 

我需要的是先運行myFunc後運行所有其他collectionView的函數。我試圖myFunc()viewDidLoad()的開始,但它沒有奏效。

+0

不會在xib或storyboard上添加'collectionview delegate和datasource'連接。 'myfunc()'完成後分配委託和數據源,然後在'override init(nibName nibNameOrNil:String?,bundle nibBundleOrNil:Bundle?)'中重新加載Collectionview –

回答

1

您需要定義comments陣列爲空,然後加載相關的數據在你的viewWillAppear中

class YourViewController: UIViewController { 
     var comments : [YourObjects] = [] 

    override func viewWillAppear(_ animated: Bool) { 
     super.viewWillAppear(animated) 
     self.myFunc() 
     } 

    func myFunc(){ 
     let jsonData2 = try JSONSerialization.jsonObject(with: data, options: []) as! [[String: Any] 
     self.comments = jsonData2 
     DispatchQueue.main.async{ 
      self.collectionView.reloadData() //reload data after 
     } 
     } 

} 

希望這有助於

+0

謝謝,它的作品,但它在紫羅蘭色盒子中出現錯誤,必須從主線程調用'UICollectionView.reloadData()' –

+0

然後你需要添加一些代碼,我會更新我的答案,因爲viewWillAppear在主線程中調用 –

+0

我的答案已更新@forrent –

1

嘗試將它放在viewWillAppear(_:)方法中並在comments數組更改後調用reloadData()

+0

'? –

+0

是的。你也可以把它放在你的自定義'init'中。 – krlb

+0

我試着把它放在init和viewillappear中,但是'numberOfItemsInSection'在這兩個鏡頭中都被第一次調用了 –

1

您應該使用重載的數據來更新UICollectionView的內容

func myFunc(){ 
    let jsonData2 = try JSONSerialization.jsonObject(with: data, options: []) as! [[String: Any] 
    self.comments = jsonData2 
    self.collectionView.reloadData() 
    } 
0

確保comments在首次使用之前被初始化的最簡單方法是使用la zy財產:

lazy var comments: [String:Any] = self.myFunc() 

func myFunc() -> [String:Any] { 
    return try! JSONSerialization.jsonObject(with: Data()) as! [String:Any] 
}