为什么我的主视图控制器不能更新,当我继续?

我试图创build一个非常简单的应用程序。 你在feedViewController中,点击吧button图标(一个摄像头)。 它需要你到AddEditViewController。

在AddEditView控制器中,一旦你点击“保存”,你想添加一个数组,将显示在feedViewController中的图片,但我的图片不显示,直到我停止模拟器中的应用程序,并再次运行。

import UIKit import CoreData import MobileCoreServices class FeedViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate, UIImagePickerControllerDelegate, UINavigationControllerDelegate { @IBOutlet weak var collectionView: UICollectionView! var feedArray: [AnyObject] = [] let managedObjectContext = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. makeItLoad() } override func viewDidAppear(animated: Bool) { self.collectionView.reloadData() } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } func makeItLoad(){ let request = NSFetchRequest(entityName: "FeedItem") let appDelegate:AppDelegate = (UIApplication.sharedApplication().delegate as! AppDelegate) let context:NSManagedObjectContext = appDelegate.managedObjectContext feedArray = try! context.executeFetchRequest(request) self.collectionView?.reloadData() } @IBAction func addPhotoButtonTapped(sender: AnyObject) { } //UICollectionViewDataSource func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int { return 1 } func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { return feedArray.count } func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { let cell:FeedCell = collectionView.dequeueReusableCellWithReuseIdentifier("cell", forIndexPath: indexPath) as! FeedCell let thisItem = feedArray[indexPath.row] as! FeedItem cell.imageView.image = UIImage(data: thisItem.image!) cell.captionLabel.text = thisItem.caption return cell } } 

和我的addEditview是:

  import UIKit import CoreData import MobileCoreServices class AddEditViewController: UIViewController,NSFetchedResultsControllerDelegate, UIImagePickerControllerDelegate, UINavigationControllerDelegate { var item : FeedItem? = nil @IBOutlet weak var addEditNameField: UITextField! @IBOutlet weak var addEditTypeField: UITextField! @IBOutlet weak var addEditHashtagField: UITextField! @IBOutlet weak var addEditImageViewHolder: UIImageView! override func viewDidLoad() { super.viewDidLoad() } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } @IBAction func addImageFromDevice(sender: AnyObject) { let pickerController = UIImagePickerController() pickerController.delegate = self pickerController.sourceType = UIImagePickerControllerSourceType.PhotoLibrary pickerController.allowsEditing = true self.presentViewController(pickerController, animated: true, completion: nil) } @IBAction func addImageFromCamera(sender: AnyObject) { let pickerController = UIImagePickerController() pickerController.delegate = self pickerController.sourceType = UIImagePickerControllerSourceType.Camera pickerController.allowsEditing = true self.presentViewController(pickerController, animated: true, completion: nil) } func imagePickerController(picker: UIImagePickerController, didFinishPickingImage image: UIImage, editingInfo: [String : AnyObject]?) { self.dismissViewControllerAnimated(true, completion: nil) self.addEditImageViewHolder.image = image } @IBAction func saveButtonTapped(sender: AnyObject) { createNewItem() dismissVC() } @IBAction func cancelButtonTapped(sender: AnyObject) { dismissVC() } func dismissVC() { navigationController?.popViewControllerAnimated(true) FeedViewController().collectionView?.reloadData() FeedViewController().viewDidLoad() } func createNewItem() { let entityDescription = NSEntityDescription.entityForName("FeedItem", inManagedObjectContext: FeedViewController().managedObjectContext) let feedItem = FeedItem(entity: entityDescription!, insertIntoManagedObjectContext: FeedViewController().managedObjectContext) feedItem.caption = addEditNameField.text feedItem.type = addEditTypeField.text feedItem.hashtags = addEditHashtagField.text feedItem.image = UIImagePNGRepresentation(addEditImageViewHolder.image!) FeedViewController().feedArray.append(feedItem) do { try FeedViewController().managedObjectContext.save() } catch { return } } func editItem() { item!.caption = addEditNameField.text item!.type = addEditTypeField.text item!.hashtags = addEditHashtagField.text item!.image = UIImagePNGRepresentation(addEditImageViewHolder.image!) do { try FeedViewController().managedObjectContext.save() } catch { return } } } 

所以我的问题是:一旦我按下相机,通过segue连接到“AddEditViewController”,我select一个图片,然后按“保存”。 为什么我的FeedViewController不能更新? 为什么我必须停止模拟器并重新启动它才能显示出来?

所以,经过一番尝试,我发现了解决办法

首先,在类的外部添加数组,使其成为全局数组,而不是:

  import UIKit import CoreData import MobileCoreServices class FeedViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate, UIImagePickerControllerDelegate, UINavigationControllerDelegate { @IBOutlet weak var collectionView: UICollectionView! var feedArray: [AnyObject] = [] 

改变它,所以你有:

  import UIKit import CoreData import MobileCoreServices var feedArray: [AnyObject] = [] class FeedViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate, UIImagePickerControllerDelegate, UINavigationControllerDelegate { @IBOutlet weak var collectionView: UICollectionView! 

而不是使用

  FeedViewController().feedArray.append(feedItem) 

现在你可以使用:

  feedArray.append(feedItem) 

问题是,每次我使用:“FeedViewController()。费用…”我创build了一个新的实例,所以我实际上没有正确追加数组。

我希望它有帮助。

在我看来,虽然将新图片保存到数据库服务,并且将其添加到用于填充集合视图的数组中,但您永远不会重新加载收集视图。 出于某种原因,如果用户取消拍摄新照片(这似乎是多余的),但在拍摄新照片后不重新加载,这似乎是重要的。

注意:向collectionView添加新数据比使用.reloadData()更有效。 .reloadData()将重新加载所有单元格,而.insertItemsAtIndexPaths()方法将只添加1个新单元格。