2014-12-09 2 views
0

Я пытаюсь добавить ячейку просмотра коллекции, когда и когда пользователь решит это сделать. он делает это в отдельном контроллере просмотра, где он дает имя и сохраняет его. но когда он вернется к исходному контроллеру представления, новая ячейка не добавится в представление коллекции.Ячейка не добавляется в представление коллекции

Вот мой код для контроллеров 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

Большая часть вашего кода выглядит хорошо ... Попробуйте перезагрузить вид коллекции в 'viewWillAppear'' collectionView'. –

ответ

0

Вы должны перезагрузить Представление коллекции

self.collectionView.reloadData 

Или же вы можете используйте reloadItemsAtIndexPath, если вы не хотите перезагружать весь просмотр коллекции/хотите показать imation, предполагая, что вы знаете indexPath нового элемента.

Теперь вопрос в том, когда вы называете это?

Самая простая вещь для вашей текущей реализации находится в viewWillAppear, но это также перезагрузит представление коллекции, когда его не нужно перезагружать (например, при первом просмотре представления или если следующий контроллер представления возвращается без добавления чего-либо и т. д. - это не огромная сделка, если ваш просмотр коллекции невелик, но его можно легко сделать лучше). Вы также можете вызвать его со второго контроллера сразу после добавления, хотя это также не так чисто. Вы также можете реализовать метод внутри вашего контроллера представления коллекции, который вызывается следующим контроллером представления всякий раз, когда он хочет добавить что-то, что включает элемент, который вы хотите добавить в качестве параметра, вместо того, чтобы напрямую добавлять его в массив другого контроллера.

Сохранение ссылки на контроллер представления и доступ к его данным напрямую также не является хорошей практикой. То, что вы действительно должны использовать, - это метод делегата (который аналогичен приведенному выше предложению, кроме более гибкого, поскольку другой диспетчер представлений не должен знать ничего о его делегировании, кроме того, что он реализует протокол делегата). Больше информации here

+1

Спасибо вам большое! :) – Seynin97

Смежные вопросы