动态tableview与部分

时间:2016-07-31 21:43:15

标签: ios iphone swift xcode uitableview

我试图创建一个动态的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下的两个第一个细胞被命名为硬拉,但其余的都是正确的。

有人可以告诉我我做错了吗?

enter image description here

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
}
}

1 个答案:

答案 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
    }


}