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

Swift4实现可选择、持久化及修改的用户头像功能求助

我来帮你搞定Swift4里的用户头像功能,支持选择、退出APP后持久化保存,还能随时更换,完整代码和细节解释如下:

完整实现代码与说明

1. 基础配置与UI关联

首先确保你的ViewController已经遵守了图片选择相关的协议,并且关联好UI控件(UIImageView用于显示头像,UIButton触发选择操作):

import UIKit

class ViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {
    
    // 关联的头像显示控件
    @IBOutlet var imageView: UIImageView!
    // 关联的选择头像按钮
    @IBOutlet var chooseButton: UIButton!
    
    // 头像存储的本地路径(Documents目录下的专属文件)
    private var avatarFilePath: String {
        let documentsDir = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]
        return documentsDir + "/user_avatar.png"
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // 初始化时加载已保存的头像
        loadSavedAvatar()
        // 给头像视图加个圆角,更像真实头像
        imageView.layer.cornerRadius = imageView.frame.size.width / 2
        imageView.clipsToBounds = true
    }
}

2. 触发图片选择逻辑

给选择按钮添加点击事件,弹出系统图片选择器,同时处理权限相关的基础判断:

extension ViewController {
    @IBAction func chooseAvatarTapped(_ sender: UIButton) {
        let imagePicker = UIImagePickerController()
        imagePicker.delegate = self
        // 允许从相册选择(也可以设置为.camera调用相机)
        imagePicker.sourceType = .photoLibrary
        
        // 检查是否能打开图片选择器
        if UIImagePickerController.isSourceTypeAvailable(.photoLibrary) {
            present(imagePicker, animated: true)
        } else {
            let alert = UIAlertController(title: "提示", message: "无法访问相册,请检查权限", preferredStyle: .alert)
            alert.addAction(UIAlertAction(title: "确定", style: .default))
            present(alert, animated: true)
        }
    }
}

3. 处理图片选择结果

实现图片选择器的代理方法,获取选中的图片并更新UI,同时保存到本地:

extension ViewController {
    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
        // 获取选中的原图
        guard let selectedImage = info[.originalImage] as? UIImage else {
            picker.dismiss(animated: true)
            return
        }
        
        // 更新头像显示
        imageView.image = selectedImage
        // 保存头像到本地
        saveAvatarToLocal(selectedImage)
        
        picker.dismiss(animated: true)
    }
    
    func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
        picker.dismiss(animated: true)
    }
}

4. 头像的持久化存储与读取

实现本地存储和读取的方法,确保退出APP后数据不会丢失:

extension ViewController {
    private func saveAvatarToLocal(_ image: UIImage) {
        // 将UIImage转成PNG数据(也可以用JPEG,质量参数0-1)
        guard let imageData = image.pngData() else { return }
        // 写入到指定路径
        do {
            try imageData.write(to: URL(fileURLWithPath: avatarFilePath))
        } catch {
            print("保存头像失败:\(error.localizedDescription)")
        }
    }
    
    private func loadSavedAvatar() {
        let fileURL = URL(fileURLWithPath: avatarFilePath)
        // 检查文件是否存在
        if FileManager.default.fileExists(atPath: avatarFilePath) {
            do {
                let imageData = try Data(contentsOf: fileURL)
                imageView.image = UIImage(data: imageData)
            } catch {
                print("加载头像失败:\(error.localizedDescription)")
            }
        }
        // 如果没有保存的头像,imageView保持空状态,符合需求
    }
}

关键细节说明

  • 持久化方式:这里选择将图片保存到APP的Documents目录,而不是UserDefaults,因为UserDefaults适合存储小体积的配置数据,图片数据较大,用文件存储更高效,也不会影响APP启动速度。
  • 头像样式优化:在viewDidLoad里给imageView设置了圆角,让显示效果更贴近真实头像,你可以根据自己的UI需求调整圆角大小。
  • 权限处理:虽然做了基础的可用性判断,你也可以在Info.plist中添加NSPhotoLibraryUsageDescription字段,说明访问相册的用途,避免iOS权限弹窗被拒。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:24:43