Дубликаты в разделе просмотра таблиц Swift

#swift #tableview

Вопрос:

Я пытаюсь поместить некоторые данные в категории в табличное представление. Пицца в категорию пиццы, гамбургеры в гамбургер и т. Д., Но у меня есть дубликат каждого товара ( Посмотрите здесь картинку . В чем может быть проблема ?

Структура :

 struct Food {
    
    var photoKeyRestaurant: String
    var foodName: String
    var foodDescription: String
    var restaurantName: String
    var priceFood: Int
    var typeFood: String
    
    
}
 

Представление таблицы

 func numberOfSections(in tableView: UITableView) -> Int {
        return food.count
    }
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return food[section].foodName.count
        
        
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "FoodTableViewCell", for: indexPath) as! FoodTableViewCell
        
        
        
        //   cell.delegate = self
        let mancare = food[indexPath.section]
        let storageRef = Storage.storage().reference()
        let photoRef = storageRef.child(mancare.photoKeyRestaurant)
        cell.foodImage.sd_setImage(with: photoRef)
        cell.descriptionLabel.text = mancare.foodDescription
        cell.foodNameLabel.text = mancare.foodName
        cell.priceLabel.text = "(mancare.priceFood) lei"
        cell.foodImage.layer.borderWidth = 1
        cell.foodImage.layer.masksToBounds = false
        cell.foodImage.layer.borderColor = UIColor.black.cgColor
        cell.foodImage.layer.cornerRadius = cell.foodImage.frame.height/2
        cell.foodImage.clipsToBounds = true
        
        //Fac ca imaginea sa fie cerc  - finish
        return cell
}
    
    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return 120
    }
    
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        tableView.deselectRow(at: indexPath, animated: true)
    }
    
    
    func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
        return food[section].typeFood
    }

 

Если кто-нибудь спросит, я получаю данные из магазина firestore, но там нет проблем, потому что данные извлекаются успешно.

Кто-нибудь знает, в чем может быть проблема ? Спасибо

Ответ №1:

Интересно, что в вашем коде на cellForRowAt самом деле никогда не упоминается indexPath.row . Это относится только к тому indexPath.section . Как вы можете получить и отобразить данные, соответствующие этой строке, которую вы должны настроить, cellForRowAt если вы каким-то образом не ссылаетесь на вопрос о том, что это за строка?

Возможно, существует какой-то другой механизм, которого я не вижу, но мне кажется, что только этот факт объясняет, почему в каждом разделе снова и снова отображаются одни и те же данные, а не разные данные для каждой строки.

Ответ №2:

У вас есть 2 большие проблемы с этим кодом.

  1. У вас неверный массив данных для разделов.
  2. в функции cellForRowAt вы не можете вернуться indexPath.section .

С первой. Вам нужно использовать 2-мерные массивы, такие как:

 var foodCategorys: [FoodCategory] = [[categoryName, Food],[categoryName, Food]]
 

Поэтому вам нужна другая структура, чтобы содержать этот 2-мерный массив:

 struct FoodCategory {
    var categoryName: String
    var listFood: [Food] = [] // Food is the struct that you currently have
}
 

Таким образом, данные, которые будут отображаться в TableView, представляют собой категорию продуктов питания массива. С помощью NumberOfSections будет возвращено количество категорий продуктов питания массива. И numberOfRowsInSection вернет количество продуктов из списка в FoodCatogory.

 func numberOfSections(in tableView: UITableView) -> Int {
   return foodCategorys.count //array of listFood
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return foodCategorys[section].listFood.count
}
 

И во-вторых, в cellForRowAt , когда вы хотите получить индекс данных списка. тебе нужно позвонить foods[indexPath.section].listFood[indexPath.row] . Функция row не нуждается в section

 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "FoodTableViewCell", for: indexPath) as! FoodTableViewCell
        //cell.delegate = self
        let mancare = foods[indexPath.section].listFood[indexPath.row] //Remeber that, the array food we are using in this line is array of FoodCategory

 

Я думаю, вам нужно изучить ключевое слово «раздел в uitableview swift» или посмотреть это видео https://www.youtube.com/watch?v=AHY09z-XS9s

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

Комментарии:

1. Здравствуйте, спасибо за ваш ответ, я получаю ошибку при объявлении категории продуктов питания : «Не удается найти» Имя категории «в области видимости»

2. Привет, с [[categoryName, Food],[categoryName, Food]] , я просто опишу, как работают 2-мерные массивы в этом случае.

3. Привет [[categoryName, Food],[categoryName, Food]] , я просто опишу, как работают 2-мерные массивы в этом случае. Вы должны понимать, что вы будете отображать в TableView категории со списком (например, категории списка имеют 2 элемента, включая: кофе и пиццу). И с пунктом кофе у вас есть название категории «Кофе» и список продуктов питания в этом пункте, например: «капуцино, экспресо». с помощью TableView section будет отображаться список категорий и row будет отображаться список продуктов питания в этих категориях. Если то, что я сказал, вас смущает, вы можете посмотреть ссылку на видео и переписать код. это работает с вашим делом.