Действие кнопки внутри ячейки коллекционного вида - Попытка сохранить объект с новым, несохраненным дочерним - PullRequest
0 голосов
/ 10 декабря 2018

У меня есть uibutton внутри ячейки коллекцииПользователям могут понравиться их сообщения с этой кнопкой.Но я получил следующие ошибки: «Поток 1: неустранимая ошибка: неожиданно обнаружил nil при развертывании необязательного значения» и «Попытка сохранить объект с новым, несохраненным дочерним элементом»

Для действия кнопки представления коллекции я сделалэто

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "AdCell", for: indexPath) as! AdCell

    cell.likeOutlet.tag = indexPath.row
    cell.likeOutlet.addTarget(self,
                              action: #selector(self.likeButt),
                              for: .touchUpInside)

и это IBAction в главном контроллере вида

@IBAction func likeButt(_ sender: UIButton) {
    if PFUser.current() != nil {

        let currUser = PFUser.current()!

        let query = PFQuery(className: LIKES_CLASS_NAME)
        query.whereKey(LIKES_CURR_USER, equalTo: currUser)
        query.whereKey(LIKES_AD_LIKED, equalTo: adObj)
        query.findObjectsInBackground { (objects, error) in
            if error == nil {

                if objects!.count == 0 
                {

                    let likeObj = PFObject(className: LIKES_CLASS_NAME)

                    likeObj[LIKES_CURR_USER] = currUser
                    likeObj[LIKES_AD_LIKED] = self.adObj
                    likeObj.saveInBackground(block: { (succ, error) in
                        if error == nil {
                            AdCell.appearance().likeOutlet.setImage(#imageLiteral(resourceName: "ad_liked"), for: .normal)
                            self.hideHUD()


                            self.adObj.incrementKey(ADS_LIKES, byAmount: 1)


                            if self.adObj[ADS_LIKED_BY] != nil {
                                var likedByArr = self.adObj[ADS_LIKED_BY] as! [String]
                                likedByArr.append(currUser.objectId!)
                                self.adObj[ADS_LIKED_BY] = likedByArr
                            } else {
                                var likedByArr = [String]()
                                likedByArr.append(currUser.objectId!)
                                self.adObj[ADS_LIKED_BY] = likedByArr
                            }
                            self.adObj.saveInBackground()


                            let sellerPointer = self.adObj[ADS_SELLER_POINTER] as! PFUser
                            let pushStr = "\(PFUser.current()![USER_USERNAME]!) liked your ad: \(self.adObj[ADS_TITLE]!)"

                            let data = [ "badge" : "Increment",
                                         "alert" : pushStr,
                                         "sound" : "bingbong.aiff"
                            ]
                            let request = [
                                "someKey" : sellerPointer.objectId!,
                                "data" : data
                                ] as [String : Any]

                            PFCloud.callFunction(inBackground: "push", withParameters: request as [String : Any], block: { (results, error) in
                                if error == nil {
                                    print ("\nPUSH SENT TO: \(sellerPointer[USER_USERNAME]!)\nMESSAGE: \(pushStr)\n")
                                } else {
                                    print ("\(error!.localizedDescription)")
                                }
                            })



                            // Save Activity
                            let activityClass = PFObject(className: ACTIVITY_CLASS_NAME)
                            activityClass[ACTIVITY_CURRENT_USER] = sellerPointer
                            activityClass[ACTIVITY_OTHER_USER] = PFUser.current()!
                            activityClass[ACTIVITY_TEXT] = pushStr
                            activityClass.saveInBackground()


                            // error on saving like
                        } else {
                            self.simpleAlert("\(error!.localizedDescription)")
                            self.hideHUD()
                        }})


                    // 3. UNLIKE THIS AD :(
                } else {
                    var likeObj = PFObject(className: LIKES_CLASS_NAME)
                    likeObj = objects![0]
                    likeObj.deleteInBackground(block: { (succ, error) in
                        if error == nil {
                            AdCell.appearance().likeOutlet.setImage(#imageLiteral(resourceName: "ad_no_like"), for: .normal)
                            self.hideHUD()


                            self.adObj.incrementKey(ADS_LIKES, byAmount: -1)


                            var likedByArr = self.adObj[ADS_LIKED_BY] as! [String]
                            likedByArr = likedByArr.filter { $0 != currUser.objectId! }
                            self.adObj[ADS_LIKED_BY] = likedByArr

                            self.adObj.saveInBackground()


                            //                                let likesNr = self.adObj[ADS_LIKES] as! Int
                            //                            self.likeLabel.text = "\(likesNr)"

                        } else {
                            self.simpleAlert("\(error!.localizedDescription)")
                            self.hideHUD()
                        }})
                }


                // error in query
            } else {
                self.simpleAlert("\(error!.localizedDescription)")
                self.hideHUD()
            }}

    } else {
        showLoginAlert("You need to login")
    }
}

На другой странице эта функция работает хорошо.но тут выдает ошибку.Чего мне не хватает?

РЕДАКТИРОВАТЬ:

Сначала эта строка выдавала ошибку , если объекты! .Count == 0

Я заменил эту строку на если объекты? .Count == 0 и работает

Но теперь likeObj = objects! [0] выдает ошибку

Когда я пишу объекты? [0] вместо объектов! [0] снова, я получаю эти ошибки

Значение необязательного типа 'PFObject?'необходимо развернуть в значение типа 'PFObject' и Поток 1: EXC_BAD_INSTRUCTION (код = EXC_I386_INVOP, субкод = 0x0)

...