【问题标题】:Passing Image to another View Controller (Swift)将图像传递给另一个视图控制器 (Swift)
【发布时间】:2015-10-13 02:26:31
【问题描述】:

我正在尝试将用户上传的图像从一个 UIImageView 移动到另一个视图控制器上的另一个 UIImageView。我可以让用户上传图像并将其保存在第一个 UIImageView 中,但是在他们按下“发布”按钮后,下一个视图控制器上的 UIImageView 保持空白。

注意:browsingImage 是第二个视图控制器(目标 UIImageView)上的 UIImageView 的名称

任何帮助将不胜感激!

@IBAction func cameraButton(sender: AnyObject) {

    addNewPicture()

}


func addNewPicture() {

    let picker = UIImagePickerController()
    picker.allowsEditing = true
    picker.delegate = self

    presentViewController(picker, animated: true, completion: nil)
}

func imagePickerController(picker: UIImagePickerController, didFinishPickingImage image: UIImage!, editingInfo: [NSObject : AnyObject]!) {

    postingImage.image = image
    self.dismissViewControllerAnimated(true, completion: nil)

}

@IBAction func postButton(sender: AnyObject) {

    performSegueWithIdentifier("toBrowsePage", sender: nil)


}

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {

    if segue.identifier == "toBrowsePage" {


        var itemToAdd = segue.destinationViewController as! ListPage

        itemToAdd.postingImage.image = browsingImage.image

    }

}

【问题讨论】:

  • 不应该是itemToAdd.browsingImage.image=postingImage.image吗?

标签: ios swift uiviewcontroller uiimageview uibutton


【解决方案1】:

prepare(for:) 中,您无法访问目标视图控制器的@IBOutlets,因为它们尚未设置。您应该将图像分配给目标视图控制器的属性,然后将其移动到 viewDidLoad() 中的位置:

在源视图控制器中:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "toBrowsePage" {
        let dvc = segue.destination as! ListPage
        dvc.newImage = postingImage.image
    }
}

在目标视图控制器中:

class ListPage: UIViewController {
    @IBOutlet weak var browsingImage: UIImageView!
    var newImage: UIImage!

    override func viewDidLoad() {
        super.viewDidLoad()
        browsingImage.image = newImage
    }
}

【讨论】:

    【解决方案2】:

    根据您的描述,browsingImage 在目标视图控制器中,所以 在这一行

    itemToAdd.postingImage.image = browsingImage.image
    

    您将目标图像视图传递给源图像视图

    【讨论】:

      【解决方案3】:

      在您当前的视图控制器中无法访问 IBOutlets。由于您的第二个视图尚未加载,因此尚未初始化出口。

      相反,您可以在第二个 viewController 中创建一个 UIImage 变量,并在 prepareForSegue 中为其分配值。

      然后在您的第二个 viewController 的 viewDidLoad 方法中将该值分配给您的 ImageView 插座。

      override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
      
          if segue.identifier == "toBrowsePage" {
              let destination = segue.destinationViewController as! ListPage
              destination.receivedImage = postingImage.image
          }
      }
      

      在你的下一个 viewController 中声明一个名为

      的变量
      @IBOutlet weak var postingImage: UIImageView!
      var receivedImage : UIImage?
      

      在 viewDidLoad 方法中

      postingImage.image = receivedImage
      

      【讨论】:

        【解决方案4】:

        Segue 发生时,您的 UIImageView 未初始化,因此您无法为其分配图像,最佳做法是传递UIImage 并在viewDidLoad 中初始化您的UIImageView

        所以在您的ListPage 类中创建UIImage 类型的属性将您的prepareForSegue 行更改为

        override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        
            if segue.identifier == "toBrowsePage" {
        
        
                var itemToAdd = segue.destinationViewController as! ListPage
        
                itemToAdd.image = browsingImage.image
        
                }
        
            }
        

        在您的目的地viewControllerviewDidLoadviewDidAppear 中,您将执行类似的操作

        browsingImage.image = image
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-12-20
          • 2012-05-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多