У меня есть 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)