添加照片,然后重新加载嵌入式照片容器视图控制器

时间:2016-06-07 12:05:25

标签: ios swift uistoryboardsegue uicontainerview

我有一个视图控制器,可以收集信息,包括将多张照片添加到记录中的功能。添加每张照片后,新照片将显示为特征照片(VC中的故事板UIImageview)。每张照片也应该添加到一个图像数组中,然后将其传递给具有自己的自定义视图控制器的容器视图,并显示出来。添加每张照片时,会显示功能照片,但容器不会随图像重新加载。

当通过准备segue方法传入现有照片数组时,照片容器似乎有效:

    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
        }
    }

如果没有照片,容器仍会加载(并打印#34;装入容器,但没有照片")。

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)

然后一行将以某种方式将该图像数组重新传递给容器。我需要一个委托方法吗?!?

2 个答案:

答案 0 :(得分:1)

你正在寻找这样的礼物吗?这样你就可以称之为你的选择函数

performSegueWithIdentifier("mySegueID", sender: nil)

IOS - How to segue programmatically using swift

答案 1 :(得分: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()调用来刷新视图,但我之前已经使用过此方法的其余部分,并且知道它有效。