2016-06-07 58 views
2

我有一個視圖控制器收集信息,包括添加多張照片到記錄的能力。隨着每張照片的添加,新照片將顯示爲特寫照片(VC中的故事板UIImageview)。每張照片還應添加到圖像數組中,然後將其傳遞到具有自己的自定義視圖控制器的容器視圖,並顯示出來。添加每張照片後,會顯示特寫照片,但容器不會重新加載圖像。添加一張照片,並重新加載嵌入式照片容器視圖控制器

容器不會出現在現有的照片陣列通過傳遞在賽格瑞方法準備,像這樣的工作照片:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) 
{ 
    if (segue.identifier == "segueToPhotoCollection") 
    { 
     if let imagesArray = images 
     { 
      print("photos prepared") 
      let controller = (segue.destinationViewController as! PhotoCollectionVC) 
      controller.images = imagesArray 
      controller.delegate = self 
     } 
    } 

如果沒有照片,容器仍然加載(並打印「容器已裝入,但沒有照片」)。

class PhotoCollectionVC: UICollectionViewController 
{ 
var images: [UIImage]? 

weak var delegate: FeatureImageController? 

override func viewDidLoad() 
{ 
    super.viewDidLoad() 

    if images?.count > 0 
    { print("container loaded with photos: \(images!.count)") } 
    else { print ("container loaded, but no photos") } 

我需要的是某種方式要麼召回prepareForSegue方法或者找到另一種方式來更新並重新裝入容器一旦圖像添加。拾取器didFinishPickingMediaWithInfo看起來像:

func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) 
{ 
    picker.dismissViewControllerAnimated(true, completion: 
    { 
     var imageTaken = info[UIImagePickerControllerEditedImage] as? UIImage 
     ... 

     if let imageTakenNotNil = imageTaken 
     { 
      if self.images == nil 
      { self.images = [] } 
      self.images?.append(imageTakenNotNil) 

然後一條線,會以某種方式的圖像的該陣列重新傳遞給容器。我需要一個委託方法來做到這一點?!?

回答

1

你在找這樣的嗎?這樣就可以把它叫做你的選擇器功能

performSegueWithIdentifier("mySegueID", sender: nil) 

IOS - How to segue programmatically using swift

+0

我試過了,但得到以下錯誤信息:「容器視圖中有意外的子視圖,也許嵌入的segue已經觸發過一次或者子程序被編程添加了?當然,嵌入segue已經觸發過一次 - 當父視圖控制器首次加載時,它會加載嵌入的segue。我需要一些東西 - 非常像這樣 - 每次拍攝照片後我都可以重複打電話。 – DrWhat

1

在您的主視圖控制器,添加一個變量,將保持對嵌入式視圖控制器的引用。在prepareForSegue中,分配這個參考。然後在didFinishPickingMediaWithInfo中,可以使用此引用在嵌入式視圖控制器中進行更改並刷新它。

因此,只要在你的IBOutlets你會碰到這樣的:

var photoControlView: PhotoCollectionVC? 

你prepareForSegue將是這樣的:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) 
{ 
    if (segue.identifier == "segueToPhotoCollection") 
    { 
     if let imagesArray = images 
     { 
      print("photos prepared") 
      let controller = (segue.destinationViewController as! PhotoCollectionVC) 
      controller.images = imagesArray 
      controller.delegate = self 
      self.photoControlView = controller 
     } 
    } 

而且在didFinishPickingMediaWithInfo你現在可以這樣做:

func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) 
{ 
    picker.dismissViewControllerAnimated(true, completion: 
    { 
     var imageTaken = info[UIImagePickerControllerEditedImage] as? UIImage 
     ... 

     if let imageTakenNotNil = imageTaken 
     { 
      if self.images == nil 
      { self.images = [] } 
      self.images?.append(imageTakenNotNil) 
      self.photoControlView!.images = self.images 
      self.photoControlView!.reloadData() 
      self.photoControlView!.setNeedsDisplay() 

我不確定setNeedsDisplay()調用是否必要或甚至正確刷新查看,但我已經使用了此方法的其餘部分,並知道它的工作原理。