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
相关产品推荐
相关产品推荐

