【问题标题】:Add a photo, and reload embedded photo container view controller添加照片,并重新加载嵌入式照片容器视图控制器
【发布时间】:2016-10-07 07:53:33
【问题描述】:

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

当一组现有照片通过 prepare for 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
        }
    }

如果没有照片,容器仍会加载(并打印“容器已加载,但没有照片”)。

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)

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

【问题讨论】:

    标签: ios swift uistoryboardsegue uicontainerview


    【解决方案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() 调用是否是必要的,甚至是正确的刷新视图,但我之前使用过此方法的其余部分并且知道它有效。

    【讨论】:

      【解决方案2】:

      你在寻找这样的东西吗?这样您就可以将其称为您的选择器功能

      performSegueWithIdentifier("mySegueID", sender: nil)
      

      IOS - How to segue programmatically using swift

      【讨论】:

      • 我试过这个,但得到以下错误消息:“容器视图中有意外的子视图。可能嵌入 segue 已经触发一次或以编程方式添加了子视图?”毫无疑问,embed segue 已经触发了一次——当父视图控制器第一次加载时,它会加载 embed segue。我需要一些东西——非常像这样——我可以在每次挑选照片后反复调用。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-03-19
      • 1970-01-01
      • 1970-01-01
      • 2011-07-07
      • 1970-01-01
      • 1970-01-01
      • 2021-02-13
      相关资源
      最近更新 更多