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

