функция должна добавить пользователя в список на другом узле в Firebase, но вместо этого она возвращает ноль - PullRequest
0 голосов
/ 24 февраля 2019

У меня есть модальное представление (сделанное в раскадровке) с именем CloseFriendsController с кнопкой, которая должна добавить текущего пользователя в список в Firebase под названием closeFriends, а затем закрыть модальное представление.Я создал функцию в CloseFriendsController и вызывал ее при нажатии кнопки:

var buttonFunc: (() -> (Void))!

@IBAction func addToCloseFriends(_ sender: UIButton) {
    buttonFunc()
    self.presentingViewController?.dismiss(animated: true, completion: nil)
    print("Added to Close Friends!")
}

func setFunction(_ function: @escaping () -> Void) {
    self.buttonFunc = function
}

Это CloseFriendsController (кнопка «Да, я не в порядке!» Связана с функцией addToCloseFriends):

Screenshot from Storyboard

Функция установлена ​​в cellForItemAt indexPath ячейки, в которой должен отображаться текущий пользователь:

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let closeFriends = collectionView.dequeueReusableCell(withReuseIdentifier: cellId, for: indexPath)

    let closeFriendsController = CloseFriendsController()
    closeFriendsController.setFunction {
        let id = CloseFriendsSystem.system.friendList[indexPath.row].uid
        CloseFriendsSystem.system.addCurrentUserToFriendsCloseFriendsLists(id)
        print("currentUser added to Friends' Close Friends list!!")

    }

    return closeFriends
}

Оператор print("Added to Close Friends!") печатается, когда buttonFunc() закомментирован, но строка buttonFunc() вызывает сбой приложения с предупреждением:

Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value

Я создал функцию под названиеми установить его таким же образом несколько раз до.Однако в этих случаях кнопка, которая вызывала функцию, находилась внутри ячейки, на которую ссылалась cellForItemAt indexPath.Из-за этого, я думаю, мне нужно найти другой способ для вызова indexPath?Но я не знаю, как мне поступить.

Я попытался создать делегат с функцией, которая заставила бы функцию buttonFunc быть создана в том же контроллере, где она установлена.Тем не менее, функция в другом контроллере никогда не вызывалась.

Я действительно застрял здесь, поэтому любая помощь будет удивительной !!

1 Ответ

0 голосов
/ 25 февраля 2019

Решение:

Вам необходимо изменить делегат CollectionView и код источника данных, как показано ниже:

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
   let closeFriends = collectionView.dequeueReusableCell(withReuseIdentifier: cellId, for: indexPath)
   return closeFriends
}

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
   // initialize closeFriendsController
   let closeFriendsController = CloseFriendsController() // change this line as you need
   closeFriendsController.id = CloseFriendsSystem.system.friendList[indexPath.row].uid
   // present closeFriendsController
   self.present(closeFriendsController, animated: true, completion: nil) // change this line if you are presenting differently
}

В вашем контроллере CloseFriendsController:

Удалить var buttonFunc: (() -> (Void))!

var id: String!

@IBAction func addToCloseFriends(_ sender: UIButton) {
   guard let id = self.id else { return }
   CloseFriendsSystem.system.addCurrentUserToFriendsCloseFriendsLists(id)
   self.presentingViewController?.dismiss(animated: true, completion: nil)
   print("Added to Close Friends!")
}

Также удалить func setFunction (_ function: @escaping () -> Void) {

self.buttonFunc = функция

} ​​

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...