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

iOS开发:如何判断用户是否从相册选择图片再触发上传逻辑?

解决方案:判断用户是否选择图片再执行上传

要解决未选择图片时上传空白的问题,核心是通过**image变量的nil状态**判断用户是否选择了图片,只有当变量不为空时才触发上传逻辑。以下是具体修改方案:

1. 明确判断逻辑

你的代码中已经用image变量存储选中的图片,只需在点击「完成」按钮时,先检查这个变量是否为nil:

  • 如果image != nil:说明用户选择了图片,执行上传并更新头像URL
  • 如果image == nil:说明用户未选择图片,仅更新文字信息(如果需要),跳过上传步骤

2. 修改updateProfile方法

将原方法中的嵌套函数拆分,调整逻辑顺序:

@IBOutlet weak var tapToChangeProfileButton: UIButton!
var imagePicker: UIImagePickerController!
var ref: DatabaseReference!
var image: UIImage? // 确保初始值为nil
var urltoPicture: String = ""

@IBAction func updateProfile(_ sender: UIButton) {
    // 1. 先更新文字信息(无论是否选图都执行)
    ref = Database.database().reference()
    guard let userID = Auth.auth().currentUser?.uid, let profileTextContent = profileText.text else {
        // 处理用户未登录或文字为空的情况
        self.navigationController?.popViewController(animated: true)
        return
    }
    ref.child("user/\(userID)").updateChildValues(["profileText": profileTextContent])
    
    // 2. 判断是否选择了图片
    if image != nil {
        uploadPic(completion: { [weak self] success in
            guard let self = self else { return }
            if success {
                // 上传成功后更新头像URL
                self.ref.child("user/\(userID)").updateChildValues(["picture": self.urltoPicture])
            }
            // 无论上传成功与否,返回上一页
            self.navigationController?.popViewController(animated: true)
        })
    } else {
        // 未选图,直接返回上一页
        self.navigationController?.popViewController(animated: true)
    }
}

3. 提取uploadPic为类方法

将原嵌套在updateProfile中的uploadPic函数移到类的外部,提升代码可读性:

func uploadPic(completion: @escaping (Bool) -> ()) {
    guard let imageSelected = self.image else {
        completion(false)
        return
    }
    guard let imageData = imageSelected.jpegData(compressionQuality: 0.1) else {
        completion(false)
        return
    }
    
    let storageRef = Storage.storage().reference(forURL: "gs://....e.appspot.com")
    guard let userID = Auth.auth().currentUser?.uid else {
        completion(false)
        return
    }
    let storageProfileRef = storageRef.child("profilePictures").child(userID)
    let metadata = StorageMetadata()
    metadata.contentType = "image/jpg"
    
    storageProfileRef.putData(imageData, metadata: metadata) { [weak self] storageMetadata, error in
        guard let self = self else { return }
        if let error = error {
            print(error.localizedDescription)
            completion(false)
            return
        }
        storageProfileRef.downloadURL { url, error in
            if let metaImageURL = url?.absoluteString {
                print(metaImageURL)
                self.urltoPicture = metaImageURL
                completion(true)
            } else {
                completion(false)
            }
        }
    }
}

4. 其他优化点

  • 添加[weak self]避免循环引用
  • 增加用户未登录、文字为空的边界判断
  • 移除冗余的arg参数(原代码中未使用)

这样修改后,只有当用户实际选择了图片时,才会执行上传操作,彻底解决未选图时上传空白的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 13:30:53