我试图创建一个动态的tableview。现在我得到了一系列未分类的运动对象(其中一些是相同的,但具有不同的记录信息)。
首先,我需要为每个添加到日志中的独特练习创建一个部分。
之后我需要将所有练习添加到特定部分,因此记录的练习为' Bench Press'在“台式压力机”下进行部分等。
现在它说 - 当我尝试分配标签时,TmpExercise没有下标成员。
有更好的方法吗?
我几个小时以来一直在研究不同的解决方案,所以我希望你们中的一些人可以帮助我: - )。
struct Objects {
var sectionName : String!
var sectionObjects : [TmpExercise]!
}
var objectArray = [Objects]()
var tmpArray = [TmpExercise()]
var exerciseDictionary = Dictionary<String, TmpExercise>()
override func viewDidLoad() {
super.viewDidLoad()
for exercise in log!.tmpExercises {
exerciseDictionary[(exercise.tmpExercise!.name)] = exercise
}
for (key, value) in exerciseDictionary {
tmpArray = [TmpExercise()]
for exercise in log!.tmpExercises {
if exercise.tmpExercise!.name == key {
tmpArray.append(exercise)
}
}
objectArray.append(Objects(sectionName: key, sectionObjects: tmpArray))
tmpArray.removeAll()
}
}
override func viewDidAppear(animated: Bool) {
tableView.reloadData()
}
// MARK: - Table view data source
func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return objectArray.count
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return objectArray[section].sectionObjects.count-1
}
func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
return objectArray[section].sectionName
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("Log Detail", forIndexPath: indexPath)// as! UITableViewCell
cell.textLabel!.text = objectArray[indexPath.section].sectionObjects[indexPath.row]
// TmpExercise has no subscript members
return cell
}
编辑: 我试图实现@Mohamed Mostafa的答案,请看看我整个班级的以下代码。
我现在已经上传了该内容的图片。两个细胞的硬拉可以很好,但是Squat有5个细胞,应该只含有3个细胞。 Squat下的两个第一个细胞被命名为硬拉,但其余的都是正确的。
有人可以告诉我我做错了吗?
struct Objects {
var sectionName : String!
var sectionObjects : [TempExercise]!
}
struct TempExercise {
var Name : String!
}
class SelectedLogViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
@IBOutlet weak var tableView: UITableView!
var log: Log?
var objectArray = [Objects]()
var tmpObjectArray = [Objects]()
var tmpArray = [TempExercise()]
var test: Objects?
var exerciseDictionary = Dictionary<String, String>()
override func viewDidLoad() {
super.viewDidLoad()
for exercise in log!.tmpExercises {
exerciseDictionary[(exercise.tmpExercise!.name)] = exercise.tmpExercise!.name
}
for (key, value) in exerciseDictionary {
tmpArray = [TempExercise(Name:value)]
objectArray.append(Objects(sectionName: key, sectionObjects: tmpArray))
tmpArray.removeAll()
}
for uniqueExercise in objectArray {
for logExercise in log!.tmpExercises {
if uniqueExercise.sectionName == logExercise.tmpExercise!.name {
let tmpEx = TempExercise(Name: logExercise.tmpExercise!.name)
tmpArray.append(tmpEx)
}
test = Objects(sectionName: uniqueExercise.sectionName, sectionObjects: tmpArray)
}
tmpObjectArray.append(test!)
test?.sectionObjects.removeAll()
}
}
// MARK: - Table view data source
func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return objectArray.count
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return tmpObjectArray[section].sectionObjects.count
}
func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
return objectArray[section].sectionName
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("Log Detail", forIndexPath: indexPath)// as! UITableViewCell
cell.textLabel!.text = tmpObjectArray[indexPath.section].sectionObjects[indexPath.row].Name
return cell
}
}
答案 0 :(得分:1)
问题发生的原因是您尝试在需要字符串值的情况下使用对象设置label.text,因此导致错误。
我试图在你想做的事情附近制作一个有效的解决方案。
struct Objects {
var sectionName : String!
var sectionObjects : [TempExercise]!
}
struct TempExercise {
var Name : String!
}
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
for (key, value) in exerciseDictionary {
tmpArray = [TempExercise(Name:value)]
objectArray.append(Objects(sectionName: key, sectionObjects: tmpArray))
tmpArray.removeAll()
}
}
// Solution for duplication
for uniqueExercise in objectArray {
tmpArray.removeAll() // YOU MISSED TO EMPTY tmpArray Which caused previous data to propagate with you to next iteration
for logExercise in log.loggedExercises {
if uniqueExercise.sectionName == logExercise.name {
let tmpEx = TempExercise(Name: logExercise.name)
tmpArray.append(tmpEx)
}
test = Objects(sectionName: uniqueExercise.sectionName, sectionObjects: tmpArray)
}
tmpObjectArray.append(test!)
test?.sectionObjects.removeAll()
}
// MARK: - Table view data source
func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return objectArray.count
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return objectArray[section].sectionObjects.count-1
}
func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
return objectArray[section].sectionName
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("Log Detail", forIndexPath: indexPath)// as! UITableViewCell
cell.textLabel!.text = objectArray[indexPath.section].sectionObjects[indexPath.row].Name
// TmpExercise has no subscript members
return cell
}
}