2015-11-26 2 views
0

Im пытается создать очень простое приложение. Вы находитесь в feedViewController, щелкните значок кнопки на панели (камера). Это приведет вас к 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 
    } 
} 

    } 

Так что мой вопрос: когда я нажимаю камеру, которая соединена с «AddEditViewController» через Segue, и я выбрать картинку и нажмите «Сохранить ». Почему мой FeedViewController не будет обновлен? Почему я должен остановить симулятор и перезапустить его, чтобы он появился?

ответ

0

Мне кажется, что, сохраняя новое изображение в службе базы данных, вы добавляете его в массив, используемый для заполнения вида коллекции, вы никогда не перезагружаете представление коллекции. По какой-то причине вы перезагружаете его, если пользователь отменяет новый снимок, который будет казаться излишним, но не перезагружайтесь после того, как будет сделана новая фотография, что будет казаться важным.

Примечание: Есть более эффективные способы добавления новых данных в collectionView, чем .reloadData(). .reloadData() перезагрузит все ячейки, а метод .insertItemsAtIndexPaths() просто добавит 1 новую ячейку.

+0

Спасибо за помощь @Acoop Это не сработало. В моем действии SaveButton я использую «rejectVC», который использует .reloadData(). –

1

Таким образом, после игры вокруг немного и пытается узнать, я нашел решение

Прежде всего, добавьте массив за пределами класса, так что глобальна, поэтому вместо того, чтобы:

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() плата ....» я создал новый экземпляр, так что я на самом деле не сделал добавьте массив правильно.

Надеюсь, это помогло.

+0

Это также ответ на другой вопрос: «добавить к массиву из другого класса в swift». Итак, чтобы подняться, важный вопрос в том, что у меня была проблема добавить к моим массивам из разных классов, и это было потому, что мой массив не был глобальным –