我尝试在用户选择时添加集合视图单元格。他在一个单独的视图控制器中执行此操作,并在其中提供名称并保存。但当它返回初始视图控制器时,新单元格不会被添加到集合视图中。
这是我的2个视图控制器的代码:
import UIKit
class FlashViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {
@IBOutlet var collectionView: UICollectionView!
var decks: [Deck] = []
override func viewDidLoad() {
super.viewDidLoad()
// Move on ...
let layout: UICollectionViewFlowLayout = UICollectionViewFlowLayout()
layout.sectionInset = UIEdgeInsets(top: 75, left: 20, bottom: 10, right: 20)
layout.itemSize = CGSize(width: 150, height: 200)
collectionView = UICollectionView(frame: self.view.frame, collectionViewLayout: layout)
self.collectionView.dataSource = self
self.collectionView.delegate = self
collectionView.registerClass(DeckCollectionViewCell.self, forCellWithReuseIdentifier: "DeckCollectionViewCell")
collectionView.backgroundColor = UIColor.whiteColor()
self.view.addSubview(collectionView!)
var deck1 = Deck()
deck1.name = "SAT is the bomb"
self.decks.append(deck1)
}
func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return self.decks.count
}
func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
var cell = collectionView.dequeueReusableCellWithReuseIdentifier("DeckCollectionViewCell", forIndexPath: indexPath) as DeckCollectionViewCell
cell.backgroundColor = UIColor.blackColor()
cell.textLabel?.text = "\(indexPath.section):\(indexPath.row)"
cell.imageView?.image = UIImage(named: "circle")
return cell
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
var nextViewController = segue.destinationViewController as NewDeckViewController
nextViewController.deckCollection = self
}
}
下一个视图控制器:
import UIKit
class NewDeckViewController : UIViewController
{
@IBOutlet weak var deckNameTextField: UITextField!
var deckCollection = FlashViewController()
override func viewDidLoad() {
super.viewDidLoad()
// Move on...
}
@IBAction func cancelTapped(sender: AnyObject) {
self.dismissViewControllerAnimated(true, completion: nil)
}
@IBAction func createTapped(sender: AnyObject) {
var newDeck = Deck()
newDeck.name = self.deckNameTextField.text
self.deckCollection.decks.append(newDeck)
self.dismissViewControllerAnimated(true, completion: nil)
}
}
答案 0 :(得分:0)
您需要重新加载集合视图
self.collectionView.reloadData
或者,如果您不想重新加载整个集合视图/想要显示动画,则可以使用reloadItemsAtIndexPath
,假设您知道新项目的indexPath。
现在问题是,你什么时候打电话给这个?
当前实现的最简单的事情是viewWillAppear
,但是当它不需要重新加载时(例如,第一次出现视图,或者下一个视图控制器返回时),它也会重新加载集合视图没有附加任何东西等 - 如果您的集合视图很小,但不是很大,但它可以很容易地做得更好)。您也可以在追加后立即从第二个视图控制器调用它,尽管这也不是那么干净。您还可以在集合视图控制器中实现一个方法,该方法由下一个视图控制器调用,只要它想要附加包含您要添加为参数的项目的内容,而不是直接将其添加到其他控制器的数组中。
保留对呈现视图控制器的引用并直接访问其数据也不是一种好习惯。你真正应该使用的是一个委托方法(类似于上面的建议,除了更灵活,因为其他视图控制器不需要知道任何关于它的委托,除了它实现委托协议)。更多信息here