UITableView不显示它应该显示的领域对象

时间:2016-11-23 19:43:52

标签: ios swift uitableview realm nspredicate

我对tableView的内容有疑问。它没有向我展示我要求的领域对象。这是我的代码: 在类的顶部我声明了这个变量:

let newPlan = TrainingPlan()

然后我有这个按钮动作,它正在复制练习对象,将它们放在一个数组中,并将其添加到领域。我这样做了,因为我只想更改这个复制的数组:

 @IBAction func savePlanAction(_ sender: AnyObject) {
    if planNameTextField.text!.isEmpty{
        planNameFehlerLabel.isHidden = false
    }
    else{
        newPlan.name = planNameTextField.text!
        newPlan.creationDate = NSDate() as Date
        let selectedExcercises = loadSelectedExcercises()
        if selectedExcercises != nil{
            for var i in (0..<selectedExcercises!.count){
                excerciseCopies.append(selectedExcercises![i])
                do{
                    try realm.write{
                        realm.add(excerciseCopies[i])
                    }
                }
                catch{
                    print(error)
                }
            }
            try! realm.write{
                realm.add(newPlan)
            }
            for object in excerciseCopies {
                do{
                    try realm.write{
                        newPlan.excercises.append(object)
                }
                }
                catch{
                    print(error)
                }
            }
            performSegue(withIdentifier: "savePlan", sender: self)
        }
        else{
            uebungFehlerLabel.isHidden = false
        }
    }
}

然后我将newPlan对象提供给另一个ViewController:

 override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier! == "savePlan" {
        let tct = segue.destination as! TrainingPlanConfTableViewController
        tct.plan = newPlan
    }
}

现在在下一个类中,我想在tableView中显示复制数组中的所有练习对象,但tableView没有显示任何内容:

class TrainingPlanConfTableViewController: UITableViewController {

//Properties
let realm = try! Realm()
var excercisesFromPlan: Results<Excercise>?{
    didSet{
        tableView.reloadData()
    }
}
var plan: TrainingPlan?

//Lifecycle
override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    loadExcercisesFromPlan()
}

//Request
func loadExcercisesFromPlan(){
    if plan != nil{
        let predicate = NSPredicate(format: "trainingsplan = %@", plan!)
        excercisesFromPlan = realm.objects(Excercise.self).filter(predicate)
    }
}

//Tableview Funktionen
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    if excercisesFromPlan != nil{
    return excercisesFromPlan!.count
}
    return 0
}

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell: TrainingPlanConfTableViewCell = tableView.dequeueReusableCell(withIdentifier: "PlanConfCell") as! TrainingPlanConfTableViewCell
    let excercise = excercisesFromPlan![indexPath.row]
    cell.nameLabel.text = excercise.name
    return cell
}

}

我在Swift中很新,我找不到问题。谓词是错误的吗?我会感谢任何帮助!如果您需要更多信息,例如数据模型等,请随时询问

1 个答案:

答案 0 :(得分:1)

由于您没有包含模型的代码,因此无法确定您的谓词是否正确。

我能说的是TrainingPlan上有一个exercises属性,您应该使用它而不是查询相同的东西。

您只需将excercisesFromPlan更改为List而不是Results

var excercisesFromPlan: List<Excercise>?

并更改loadExcercisesFromPlan以获取

func loadExcercisesFromPlan() {
    excercisesFromPlan = plan?.excercises
}