Передача данных между различными CollectionViewCell - PullRequest
0 голосов
/ 27 мая 2018

Я хотел бы передать данные из FeedCollectionViewCell в другой ChatViewController.

Внутри контроллера представления фида

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell{
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: cellIdentifier, for: indexPath) as! FeedCollectionViewCell
cell.postTextView.text = posts.reversed()[indexPath.row].caption
cell.postImageView.image = UIImage(named: "photoplaceholder.jpg")
cell.priceTextView.text = posts.reversed()[indexPath.row].price
cell.categoryTextView.text = posts.reversed()[indexPath.row].category
cell.usernameLabel.text = posts.reversed()[indexPath.row].username
cell.buttonEvents = {
    let storyboard = UIStoryboard(name: "Main" , bundle: nil)
    let chatViewController =
        storyboard.instantiateViewController(withIdentifier: "chat")
    self.present(chatViewController, animated: true,completion: nil)
    var receiverIDNumber = cell.usernameLabel.text
}

// Я хочу передать receiveIDIDNumber в ChatViewController

Внутри ChatViewController:

    func sendDataToDatabase(message: String){
    let ref = Database.database().reference()
    let senderIDNumber = Auth.auth().currentUser?.uid
    **//I want receiverIDNumber to be the data that is passed from  FeedViewController**
    let receiverIDNumber = "21"
    let postsReference = ref.child("chats")
    let newPostId = postsReference.childByAutoId().key
    let newPostReference = postsReference.child(newPostId)
    newPostReference.setValue(["message" : messageText.text!, "senderID" : senderIDNumber, "receiverID" : receiverIDNumber], withCompletionBlock: {
        (error, ref) in
        if error != nil {
            return
        }
    })
}

Я пытаюсь получить receiveIDNumber (пользователь, который получит сообщение) из FeedCollectionViewCell

Для cell.buttonEvents в MainViewController, это открыть ChatViewController.

Модель для Main показана ниже:

class Post{
var caption: String
var photoUrl: String
var price: String
var category: String
var username: String
var pic: String
init(captionText: String, photoUrlString: String, priceText: String, categoryText: String, usernameLabel: String, profileImageURL: String){
    caption = captionText
    photoUrl = photoUrlString
    price = priceText
    category = categoryText
    username = usernameLabel
    pic = profileImageURL
}

Например, в ячейке есть кнопка рядом с userprofileimage, на которую люди могут нажать, чтобы пообщаться с пользователями.Кнопка, он будет направлять их в ChatViewController. В ChatViewController я использовал другую модель:

class Chat {
var message: String
var senderID: String
var receiverID: String

init(messageTextString: String, senderIDNumber: String, receiverIDNumber: String){
    message = messageTextString
    senderID = senderIDNumber
    receiverID = receiverIDNumber
}

Так как receiveIDNumber (receiveUsername) получен из ChatCollectionView, я нахожу затруднения при согласовании его с именем пользователя из Main.

1 Ответ

0 голосов
/ 27 мая 2018

Сначала добавьте переменную в свой класс ChatViewController:

class ChatViewController: UIViewController {
    var username: String = ""

    override func viewDidLoad() {
        super.viewDidLoad()

        // Check if userID has been given a value
        if !username.isEmpty {
            // Do stuff here with username
        }
    }
}

Затем вы можете присвоить этому значение после создания экземпляра контроллера представления.Я поместил это в метод didSelectRow, поэтому новый контроллер представления появится при выборе ячейки.Вам все еще нужно сделать каждую ячейку методом cellForItemAt.

override func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: IndexPath) {
    let storyboard = UIStoryboard(name: "Main" , bundle: nil)
    let chatViewController = storyboard.instantiateViewController(withIdentifier: "chat")
    // Here is the important bit
    chatViewController.username = posts.reversed()[indexPath.row].username
    // Present view controller
    self.present(chatViewController, animated: true,completion: nil)
}

Несколько замечаний:

  • Не помещать никаких действий, просматривать презентации контроллера и т. Д. ВcellForItemAt метод.Система вызывает его для каждого элемента каждый раз, когда перерисовывается представление коллекции, так что это будет хаос. только для настройки внешнего вида каждой ячейки.

  • Создайте новый перевернутый массив сообщений, а не переворачивайте его каждый раз, когда вам это нужно: let reversedPosts = posts.reversed()

  • Я не уверен, что вы buttonEvents делаете.Это закрытие, которое вызывается при нажатии кнопки?Вот почему я решил представить новый контроллер представления, когда выбрана ячейка.

  • Вы также можете сделать это с помощью пользовательского сценария и использовать методы: performSegue для представления нового представления.контроллер и prepareForSegue для отправки данных новому контроллеру представления перед его представлением.Это будет вместо self.present() и т. Д.

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