我正在尝试更新我的用户个人资料,但是收到错误消息我该如何解决?
线程1:致命错误:展开包装时意外发现nil 可选值
TextView
这是上下文的完整代码
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<com.google.android.material.card.MaterialCardView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10sp"
android:id="@+id/overall_statistics"
>
<GridLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:paddingLeft="15sp"
android:paddingTop="10sp"
android:paddingRight="15sp"
android:paddingBottom="10sp"
android:columnCount="3"
android:rowCount="2"
>
<TextView
android:layout_row="0"
android:layout_rowSpan="1"
android:layout_column="0"
android:layout_columnSpan="1"
android:layout_gravity="fill_horizontal"
android:gravity="bottom|center_horizontal"
android:text="4452"
android:layout_width="0dp"
android:layout_columnWeight="1"
android:textColor="#000000"
android:textSize="24sp" />
<TextView
android:layout_width="0dp"
android:layout_row="1"
android:layout_rowSpan="1"
android:layout_column="0"
android:layout_columnSpan="1"
android:layout_columnWeight="1"
android:layout_gravity="fill_horizontal"
android:gravity="top|center_horizontal"
android:text="abcdef"
android:textColor="#000000"
android:textSize="16sp" />
<TextView
android:layout_row="0"
android:layout_rowSpan="1"
android:layout_column="1"
android:layout_columnSpan="1"
android:layout_gravity="fill_horizontal"
android:gravity="bottom|center_horizontal"
android:paddingLeft="16sp"
android:layout_width="0dp"
android:layout_columnWeight="1"
android:text="2000"
android:textColor="#000000"
android:textSize="24sp" />
<TextView
android:id="@+id/textView"
android:layout_width="0dp"
android:layout_row="1"
android:layout_rowSpan="1"
android:layout_column="1"
android:layout_columnSpan="1"
android:layout_columnWeight="1"
android:layout_gravity="fill_horizontal"
android:gravity="top|center_horizontal"
android:paddingLeft="16sp"
android:text="abcd"
android:textColor="#000000"
android:textSize="16sp" />
<TextView
android:layout_row="0"
android:layout_rowSpan="1"
android:layout_column="2"
android:layout_columnSpan="1"
android:layout_gravity="fill_horizontal"
android:gravity="bottom|center_horizontal"
android:paddingLeft="16sp"
android:layout_columnWeight="1"
android:layout_width="0dp"
android:text="2252"
android:textColor="#000000"
android:textSize="24sp" />
<TextView
android:layout_width="0dp"
android:layout_row="1"
android:layout_rowSpan="1"
android:layout_column="2"
android:layout_columnSpan="1"
android:layout_columnWeight="1"
android:layout_gravity="fill_horizontal"
android:gravity="top|center_horizontal"
android:paddingLeft="16sp"
android:text="abcdefgh"
android:textColor="#000000"
android:textSize="16sp" />
</GridLayout>
</com.google.android.material.card.MaterialCardView>
</LinearLayout>
答案 0 :(得分:1)
现在您有3个可选值self.UsernameTextField.text
,self.EmailTextField.text
和ProfileImageUrl
当您使用!
感叹号时,您将强制打开可选值,假设“ 它永远不会为零”,因此,如果您访问nil
值,则应用会崩溃。
因此,切勿使用!
。我宁愿撒上if let
和guard let
if let username = self.UsernameTextField.text, let email = self.EmailTextField.text,let imageProfileUrl = ProfileImageUrl {
newUsersReference.setValue(["username":username, "email": email, "ProfileImageUrl": imageProfileUrl])
}
或执行以下操作
newUsersReference.setValue(["username":self.UsernameTextField.text ?? "", "email": self.EmailTextField.text ?? "", "ProfileImageUrl": imageProfileUrl ?? ""])
,以便在值为""
的情况下设置默认值空字符串nil
答案 1 :(得分:0)
这对我有用。
let storageRef = Storage.storage().reference().child("PATH\FileName")
如果您只想在存储中保存一张图片,请为其指定一个修复名称。如果每个用户可以拥有一个个人头像(在大多数情况下),则可以使用此图片
guard let uid = Auth.auth().currentUser?.uid else { return }
let storageRef = Storage.storage().reference().child(uid)
答案 2 :(得分:0)
为什么要强行展开可选内容?。
您可以在此处使用if-let
。
//if ProfileImageUrl has value, it will be set in `newUsersReference`.
if let img = ProfileImageUrl {
newUsersReference.setValue(["username": self.UsernameTextField.text!, "email": self.EmailTextField.text!, "ProfileImageUrl": img])
}
答案 3 :(得分:0)
尝试使用条件语句解开变量
//if ProfileImageUrl has some value then execute statement
if let imageProfileUrl = ProfileImageUrl {
newUsersReference.setValue(["username": self.UsernameTextField.text!, "email": self.EmailTextField.text!, "ProfileImageUrl": imageProfileUrl])
}
答案 4 :(得分:0)
这是问题的一部分
let UsersReference = ref.child("users").child(user.uid)
您要创建对Firebase的引用
root/users/uid
然后您尝试阅读
let newUsersReference = UsersReference.child(uid)
是
/root/users/uid/uid
我认为您想要更多类似的东西-在我的iPad上键入内容,因此请勿复制粘贴,但应将其关闭。
func updateUserProfile() {
guard let currentUser = Auth.auth().currentUser else { return }
let uid = currentUser.uid
let storage = Storage.storage()
let storageRef = Storage.storage().reference(forURL: "gs://tvmassmedianetwork.appspot.com").child("profile_Image").child(uid)
if let ProfileImge = self.SelectedImage, let imagedata = ProfileImge.jpegData(compressionQuality: 0.1) {
let uploadTask = storageRef.putData(imagedata, metadata: nil) { (metadata, error) in
if error != nil {
return
}
guard let metadata = metadata else {
return
}
storageRef.downloadURL { (url, error) in
guard let downloadURL = url else { return }
let ref = Database.database().reference()
let thisUserRef = ref.child("users").child(uid)
thisUserRef.setValue(["username": self.UsernameTextField.text!, "email": self.EmailTextField.text!, "ProfileImageUrl": downloadURL])
}
}
}
}
另外两个答案也有一些很好的信息-请把选项视为...可选-它们可能为零,因此您需要考虑这一点。用!强制解开它们!可能很危险-保持您的代码安全并相应地处理nil。