Передайте данные из CollectionView в TabBarController, чем его потомкам в Swift - PullRequest
0 голосов
/ 22 января 2020

Я новичок в Swift. Невозможно найти решение для проблемы ниже. Ниже показан ViewController с CollectionView, и когда вы нажимаете на Cell в CollectionView, данные из ячейки (даже если они не находятся в представлении метки и изображения, но находятся в строке массива Book) должны быть отправлены в TabBarCollection, а не из TabBarCollection. Мне нужно отправить эти данные всем детям, как на этом изображении. Позже в потомках TabBar я установлю значение Labels в View Controllers из данных из выбранной ячейки. image

Book.swift

import UIKit

struct Book {
    let title: String
    let image: UIImage?
    //Here soon will be more "let", and this data will also have to be send to TabBar but it don't will be show I CollectionViewCell
}

extension Book {

    static let books: [Book] = [
    Book(title: "Antygona", image: UIImage(named: "imgantygona")!),
    //etc
    ]
}

CollectionViewCell.swift

import UIKit

class CollectionViewCell: UICollectionViewCell {

    @IBOutlet weak var bookImageView: UIImageView!
    @IBOutlet weak var bookTitle: UILabel!

    func setup(with book: Book) {
        bookTitle.text = book.title
        bookImageView.image = book.image
    }
}

ViewController

import UIKit

class ViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource {

    @IBOutlet weak var collectionView: UICollectionView!
    let books = Book.books

    override func viewDidLoad() {
        super.viewDidLoad()


        let fontAttributes = [NSAttributedString.Key.font: UIFont.systemFont(ofSize: 16.0)]
        UITabBarItem.appearance().setTitleTextAttributes(fontAttributes, for: .normal)

        collectionView.dataSource = self
        collectionView.delegate = self      

    }

    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return books.count
    }

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "bookCell", for: indexPath) as! CollectionViewCell

        let book = books[indexPath.item]
        cell.setup(with: book)

        return cell
    }
}

I видел много решений, но я не могу идеально приспособить его к моей проблеме. :( Спасибо за помощь!

BookInsideViewController.swift


import UIKit

class BookInsideViewController: UIViewController {

    @IBOutlet weak var testImageView: UIImageView!
    @IBOutlet weak var testLabel: UILabel!


    override func viewDidLoad() {
        super.viewDidLoad()

    }
}

1 Ответ

1 голос
/ 22 января 2020

Вы можете использовать представление коллекции DidSelectItemAt, функция

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {


    let storyboard = UIStoryboard(name: "Main", bundle: nil)
let tabBarController = storyboard.instantiateViewController(withIdentifier: "YourtabbarIdentifier") as! UITabBarController

// You should access the `imageController` through your `tabBarController`, 
// not instantiate it from storyboard.
if let viewControllers = tabBarController.viewControllers, 
   let imageController = viewControllers.first as? ImageController {
    BookInsideViewController.recivedData1 = Books[indexPath.row]
}

navigationController?.pushViewController(tabBarController, animated: true)

}
...