如何成功更新用户个人资料

时间:2019-11-23 02:59:35

标签: ios swift firebase

我正在尝试更新我的用户个人资料,但是收到错误消息我该如何解决?

  

线程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>

5 个答案:

答案 0 :(得分:1)

现在您有3个可选值self.UsernameTextField.textself.EmailTextField.textProfileImageUrl

当您使用!感叹号时,您将强制打开可选值,假设“ 它永远不会为零”,因此,如果您访问nil值,则应用会崩溃。 因此,切勿使用!。我宁愿撒上if letguard 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。