You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift:点击按钮将图片传入第二个ViewController并创建UIImageView

跨ViewController传递图片并创建UIImageView实现方案

嘿,作为Swift初学者,跨VC传递数据并动态创建视图其实很容易上手,我来一步步帮你搞定这个需求:

1. 先给第二个ViewController准备接收图片的属性

首先打开你的第二个ViewController文件,定义一个可选的UIImage属性,用来接收从第一个VC传过来的图片:

class SecondViewController: UIViewController {
    // 用来接收传递的图片
    var selectedImage: UIImage?
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // 后续会添加创建UIImageView的代码
    }
}

2. 从第一个ViewController传递图片

假设你已经通过UIImagePickerController让用户选好了图片(核心是拿到didFinishPickingMediaWithInfo回调里的图片),接下来分两种跳转场景处理:

场景A:用Storyboard Segue跳转

如果是通过Storyboard里的按钮Segue跳转,在第一个VC里实现prepare(for:sender:)方法传递图片:

class FirstViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {
    var userSelectedImage: UIImage?
    // 可以再定义姓名、日期的存储属性,传递逻辑和图片一致
    var userName: String?
    var selectedDate: Date?
    
    // 用户选择图片后的回调示例
    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
        if let image = info[.originalImage] as? UIImage {
            userSelectedImage = image
        }
        picker.dismiss(animated: true)
    }
    
    // 准备Segue时传递数据
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "GoToSecondVC" { // 记得给Segue设置对应标识符
            let secondVC = segue.destination as! SecondViewController
            secondVC.selectedImage = userSelectedImage
            // 同时传递姓名、日期
            secondVC.userName = userName
            secondVC.selectedDate = selectedDate
        }
    }
}

场景B:纯代码跳转ViewController

如果是用代码创建并跳转第二个VC,直接赋值属性即可:

// 在第一个VC的按钮点击方法里
@IBAction func goToSecondVCTapped(_ sender: UIButton) {
    let secondVC = SecondViewController()
    secondVC.selectedImage = userSelectedImage // 传递用户选的图片
    // 同时传递姓名、日期
    secondVC.userName = userName
    secondVC.selectedDate = selectedDate
    
    navigationController?.pushViewController(secondVC, animated: true)
    // 如果是模态跳转用 present(secondVC, animated: true)
}

3. 在第二个ViewController里创建并布局UIImageView

回到第二个VC的viewDidLoad方法,添加创建UIImageView的逻辑,这里结合你原来的代码做了安全优化(避免强制解包):

class SecondViewController: UIViewController {
    var selectedImage: UIImage?
    var userName: String?
    var selectedDate: Date?
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        guard let receivedImage = selectedImage else {
            // 没有接收到图片时的处理,比如提示用户
            print("未获取到图片")
            return
        }
        
        // 创建UIImageView
        let imageView = UIImageView(image: receivedImage)
        imageView.translatesAutoresizingMaskIntoConstraints = false
        imageView.contentMode = .scaleAspectFit // 可选:设置图片适配模式,避免拉伸变形
        view.addSubview(imageView)
        
        // 添加约束(示例为居中+固定宽高,可根据需求调整)
        NSLayoutConstraint.activate([
            imageView.centerXAnchor.constraint(equalTo: view.centerXAnchor),
            imageView.centerYAnchor.constraint(equalTo: view.centerYAnchor),
            imageView.widthAnchor.constraint(equalToConstant: 200),
            imageView.heightAnchor.constraint(equalToConstant: 200)
        ])
        
        // 如果需要展示姓名、日期,也可以在这里创建UILabel并布局
        if let name = userName {
            let nameLabel = UILabel()
            nameLabel.text = "姓名:\(name)"
            nameLabel.translatesAutoresizingMaskIntoConstraints = false
            view.addSubview(nameLabel)
            NSLayoutConstraint.activate([
                nameLabel.topAnchor.constraint(equalTo: imageView.bottomAnchor, constant: 20),
                nameLabel.centerXAnchor.constraint(equalTo: view.centerXAnchor)
            ])
        }
    }
}

额外提醒

  • 记得给第一个VC的UIImagePickerController设置代理,并且在Info.plist里添加相册访问权限描述(NSPhotoLibraryUsageDescription),否则会崩溃。
  • 尽量用guard let/if let做安全绑定,避免!强制解包导致空值崩溃。

内容的提问来源于stack exchange,提问作者nemperc

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:49:21