Отображать разные данные таблицы в зависимости от того, какая ячейка коллекции выбрана - PullRequest
1 голос
/ 28 июня 2019

Вот скриншот пользовательского интерфейса

У меня есть представление коллекции над моим видом таблицы.Я пытаюсь изменить данные табличного представления в зависимости от того, какая ячейка коллекционного вида выбрана.

Это представление обрабатывает выбор элементов меню, и элементы меню отображаются в табличном представлении.Категории для этих пунктов меню отображаются в горизонтально прокручиваемом виде коллекции прямо над табличным видом.

Класс ресторана имеет переменную экземпляра .categories, которая возвращает массив строк.Это то, что заполняет коллекцию.Класс пункта меню имеет переменную экземпляра .category, которая возвращает одну строку.Я намерен сопоставить эти два.

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

Для моей коллекции:


    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        if let count = restaurant?.categories.count {
            return count
        } else {
            return 0
        }
    }

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

        // Sets label text and images for each category
        cell.categoryLabel.text = restaurant?.categories[indexPath.row]
        if UIImage(named: (restaurant?.categories[indexPath.row])!) != nil {
            cell.buttonView.image = UIImage(named: (restaurant?.categories[indexPath.row])!)
        }

        return cell
    }

Для моей таблицы:

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        if let count = restaurant?.menuItems.count {
            return count
        } else {
            return 0
        }
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = masterTableView.dequeueReusableCell(withIdentifier: "menuCell", for: indexPath) as! MenuItemCell
        cell.selectionStyle = UITableViewCell.SelectionStyle.none

        let currentItem = restaurant?.menuItems[indexPath.row]
        cell.item = currentItem

        return cell
    }

Прямо сейчас мой результат (очевидно) состоит в том, что просто всеэлементов моего меню отображаются в виде таблицы независимо от того, какая ячейка коллекции выбрана.

Ответы [ 2 ]

0 голосов
/ 28 июня 2019

Две вещи, необходимые в следующем формате для вашего вопроса.

1. Ресторан?. значения категорий:

[popular, milk tea, snacks, tea, ...]

2. Ресторан?. Значения menuItems:

{
    popular : [
                {
                    "name" : "thai-tea",
                    "price": "$6",
                    "thumbnailURL" : "https://.../thai.png"
                },
                {
                    "name" : "milk-tea",
                    "price": "$3",
                    "thumbnailURL" : "https://.../ml.png"
                }
            ],
    snacks : [
                {
                    "name" : "brownie",
                    "price": "$7",
                    "thumbnailURL" : "https://.../brw.png"
                },
                {
                    "name" : "pasta",
                    "price": "$3",
                    "thumbnailURL" : "https://.../pas.png"
                }
            ]
}

Глобальная переменная

var whichCellSelect : Int = 0

CollectionView

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

    whichCellSelect = indexPath.item
    yourTableView.reloadData()
}

Tableview

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    if let count = restaurant?.menuItems.count {
        return count
    } else {
        return 0
    }
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = masterTableView.dequeueReusableCell(withIdentifier: "menuCell", for: indexPath) as! MenuItemCell
    cell.selectionStyle = UITableViewCell.SelectionStyle.none

    let currentCategory = restaurant?.categories[whichCellSelect] // You will get String here
    let currentMenuItem = restaurant?.menuItems[currentCategory] // You will get Array here
    cell.item = currentItem

    return cell
}

Примечания

Убедитесь, что тип данных restaurant? .Categories равен [String], а тип данных restaurant? .MenuItems - [String : Any]. Это один из самых простых способов понять передачу данных в пределах UIViewController

0 голосов
/ 28 июня 2019

Как хранятся разные категории? Используете ли вы массив для каждой категории и отправляете этот конкретный массив в TableView после выбора опции в CollectionView? Затем вам нужно обновить TableView, чтобы изменения отразились на интерфейсе.

Я также не вижу, откуда вы получаете то, что пользователь нажал в CollectionView. ... вы не можете использовать что-то подобное ...

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

}

чтобы получить то, что они выбрали, используйте этот выбор, чтобы обновить таблицу, записав другой массив или добавив только определенные элементы массива в зависимости от категории, затем используйте reloadData(), чтобы обновить таблицу.

...