gpt4 book ai didi

swift - 使用 Realm 和 Swift 的 UITableView 具有按字母顺序排列的多个部分,多个标签与相同的数据连接

转载 作者:行者123 更新时间:2023-11-30 10:29:33 24 4
gpt4 key购买 nike

我们已经尝试解决这个问题 10 多天了,但仍然没有解决这个问题。

我正在尝试根据“ExerciseName”列的名称按字母顺序从 A-Z 将部分添加到 TableView 中。我还有“BodyPartName”、“CategoryName”?每个“ExerciseName”的数据列。

我想从 A-Z 填充各个部分,并将“ExerciseName”与“BodyPartName”和“CategoryName”一起排序到每个部分,以获取同一行中的其他标签。

我成功地在A-Z部分下实现ExerciseName,但无法将BodyPartName和CategoryName添加到同一行的其他标签中。请帮忙!!

预期结果

一个

腹肌“(核心)”

ARM 按压“( ARM )”“(哑铃)”

B

二头肌弯举“( ARM )”“(杠铃)”

背部扩展“(背部)”“(机器)”

无法填充同一行的“BodyPartName”标签和“CategoryName”标签。

这是我的 Realm 数据模型:

class Exercises: Object
{

@objc dynamic var ExerciseID = 0
@objc dynamic var ExerciseName = ""
@objc dynamic var BodyPartName = ""
@objc dynamic var CategoryName: String? = ""

//Adding Parent Table BodyPart & Category.
var parentBodyParts = LinkingObjects(fromType: BodyParts.self, property: "exercises")
var parentCategory = LinkingObjects(fromType: Category.self, property: "category")

}

我的代码:

let realm = try! Realm()
var exerciseArray: Results<Exercises>!

override func viewDidLoad()
{
super.viewDidLoad()
tableView.register(UINib(nibName: "customCell", bundle: nil), forCellReuseIdentifier: cellID)
sectionFunction()
}

var sectionDictionary = [String:[String]]()
var sectionTitles = [String]()

func sectionFunction()
{
exerciseArray = realm.objects(Exercises.self).sorted(byKeyPath: "ExerciseName")

for section in exerciseArray
{
let sectionKey = String(section.ExerciseName.prefix(1))

if var sectionValues = sectionDictionary[sectionKey]
{
sectionValues.append(section.ExerciseName) // Adding ExerciseNames to the Keys
sectionDictionary[sectionKey] = sectionValues
}
else
{
sectionDictionary[sectionKey] = [section.ExerciseName]
}
}
sectionTitles = [String](sectionDictionary.keys)
sectionTitles = sectionTitles.sorted(by: {$0 < $1}) // Alphabetical order for Keys:Values
}

override func numberOfSections(in tableView: UITableView) -> Int
{
return sectionTitles.count
}


override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String?
{
return sectionTitles[section]
}


override func sectionIndexTitles(for tableView: UITableView) -> [String]?
{
return sectionTitles
}


override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
{
let sectionKey = sectionTitles[section]
if let sectionValues = sectionDictionary[sectionKey]
{
return sectionValues.count
}
return 0
// return exercises.filter("ExerciseName == %@", sectionNames[section]).count
}

// Register custom cell for Table View
let cellID = "customCell"

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
{
let cell = tableView.dequeueReusableCell(withIdentifier: cellID, for: indexPath) as! customCell

let sectionKey = sectionTitles[indexPath.section]
if let sectionValues = sectionDictionary[sectionKey]
{
exerciseArray = realm.objects(Exercises.self).sorted(byKeyPath: "ExerciseName")

cell.exerciseName.text = sectionValues[indexPath.row]
cell.bodyPartName.text = exerciseArray.filter("ExerciseName == %@", sectionValues[indexPath.row]) [indexPath.row].BodyPartName
cell.categoryName.text = exerciseArray.filter("ExerciseName == %@", sectionValues[indexPath.row]) [indexPath.row].CategoryName ?? ""
cell.backgroundColor = .clear
}
return cell
}

自定义单元格:

class customCell: UITableViewCell {

@IBOutlet weak var exerciseName: UILabel!
@IBOutlet weak var bodyPartName: UILabel!
@IBOutlet weak var categoryName: UILabel!

override func awakeFromNib() {
super.awakeFromNib()
}

override func setSelected(_ selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
}

}

最佳答案

问题中的代码存在许多问题,让我提供一个可能有帮助的示例,而不是试图剖析它们。

假设我们在 Realm 中存储了一堆水果。我们希望使用部分在表格 View 中按字母顺序显示它们

A
Apple
B
Banana

等等

第一段代码是一个结构,用于保存部分标题以及该部分中的水果数组。此外,还有一个 FruitNameArray 类,它将充当保存所有 FruitStructs 的 tableView 数据源。

struct FruitStruct {
var sectionTitle = ""
var fruitNameArray = [String]()
}

var fruitDataSource = [FruitStruct]()

我正在使用一个数组来保存初始数据,但在您的情况下,它可能是从 Realm 填充的 Realm 结果对象。这是从 viewDidLoad 调用的,用于将我们的数据组织到 dataSource 数组中

func setupDataSourceData() {
let fruitArray = ["Apple", "Pear", "Banana", "Bing Cherry", "Grape", "Orange", "Plum", "Watermelon", "Cantelope"]

let allFirstChars = fruitArray.map { String($0.prefix(1)) } //get all first chars for section titles
let sectionTitles = Array(Set(allFirstChars)).sorted() //eliminate dups and sort

//iterate over the unique section titles and get the fruits that are in that section
// sort and then craft structs to hold the title and the associated fruits
sectionTitles.forEach { firstChar in
let results = fruitArray.filter { $0.prefix(1) == firstChar }
let sortedFruits = results.sorted()
let fruit = FruitStruct(sectionTitle: firstChar, fruitNameArray: sortedFruits)
fruitDataSource.append(fruit)
}

for fruitData in fruitDataSource {
print(fruitData.sectionTitle)
let fruits = fruitData.fruitNameArray
for fruitName in fruits {
print(" \(fruitName)")
}
}
}

然后,tableView 需要 4 个函数来显示各个部分,然后显示每个部分中的行。您似乎拥有这 4 个,但可能不需要另外一个 sectionIndexTitles

//
//handle sections
//
func numberOfSections(in tableView: UITableView) -> Int {
return self.fruitDataSource.count
}

func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
let title = self.fruitDataSource[section].sectionTitle
return title
}

//
//handleTableView rows
//
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
let rowsInSection = self.fruitDataSource[section].fruitNameArray.count
return rowsInSection
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cellReuseIdentifier", for: indexPath)
let text = self.fruitDataSource[indexPath.section].fruitNameArray[indexPath.row]
cell.textLabel?.text = text
return cell
}

请注意,在填充 tableView 时,我没有执行任何过滤和任何其他操作。该部分代码需要快速且易于 UI 响应尽可能快。

我只是得到一个字符串

let text = self.fruitDataSource[indexPath.section].fruitNameArray[indexPath.row]

但就您而言,您可能希望返回一个 exersise 对象,然后您可以在其中获取exerciseName 和 bodypartName,然后在自定义 cellView 中分配它们

最佳实践说明:类属性应采用小写形式 -exerciseName,而不是大写形式ExerciseName。类和结构名称通常大写。

关于swift - 使用 Realm 和 Swift 的 UITableView 具有按字母顺序排列的多个部分,多个标签与相同的数据连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59438921/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com