#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 большие проблемы с этим кодом.
- У вас неверный массив данных для разделов.
- в функции
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 элемента, включая: кофе и пиццу). И с пунктом кофе у вас есть название категории «Кофе» и список продуктов питания в этом пункте, например: «капуцино, экспресо». с помощью TableViewsection
будет отображаться список категорий иrow
будет отображаться список продуктов питания в этих категориях. Если то, что я сказал, вас смущает, вы можете посмотреть ссылку на видео и переписать код. это работает с вашим делом.