2016-06-07 46 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()调用是否必要或甚至正确刷新查看,但我已经使用了此方法的其余部分,并知道它的工作原理。