- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在构建一个具有两个 CoreData 实体的应用程序 - 锻炼和锻炼。两者之间是多对多的关系。
该应用程序是一对基本的 tableViewController,允许您将锻炼 (workoutName) 添加到 Workouts 实体,然后在下一个 tableViewController 中将锻炼添加到该 Workout。我正在苦苦挣扎的是如何将每个练习分配回它在 CoreData 中起源的锻炼。本质上,当我向 Exercises 实体添加 newExercise(使用 exerciseName 变量)时,我要做的是在 Workouts 实体中设置 workoutsName 值。
我将 workoutName 作为 var workout 通过 Workouts tableViewController 的 segue 传递给 Exercise tableViewController。
我也有多对多关系,并在 NSManagedObjects 文件中设置为 NSSet,但不知道如何使用它们。
这是练习设置的 tableViewController:
import UIKit
import CoreData
class ExerciseMasterTableViewController: UITableViewController {
// Declare workout variable
var workout: Workouts!
// Create an empty array of Exercises
var exercises = [Exercises]()
// Retreive the managedObjectContext from AppDelegate
let managedObjectContext = (UIApplication.sharedApplication().delegate as AppDelegate).managedObjectContext
override func viewDidLoad() {
super.viewDidLoad()
// Use optional binding to confirm the managedObjectContext
if let moc = self.managedObjectContext {
}
fetchExercises()
}
func fetchExercises() {
let fetchRequest = NSFetchRequest(entityName: "Exercises")
// Create a sort descriptor object that sorts on the "exerciseName"
// property of the Core Data object
let sortDescriptor = NSSortDescriptor(key: "exerciseName", ascending: true)
// Set the list of sort descriptors in the fetch request,
// so it includes the sort descriptor
fetchRequest.sortDescriptors = [sortDescriptor]
if let fetchResults = managedObjectContext!.executeFetchRequest(fetchRequest, error: nil) as? [Exercises] {
exercises = fetchResults
}
}
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
// How many rows are there in this section?
// There's only 1 section, and it has a number of rows
// equal to the number of exercises, so return the count
return exercises.count
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = self.tableView.dequeueReusableCellWithIdentifier("Exercise Cell", forIndexPath: indexPath) as UITableViewCell
// Get the Exercises for this index
let exercise = exercises[indexPath.row]
// Set the title of the cell to be the title of the exercise
cell.textLabel!.text = exercise.exerciseName
cell.detailTextLabel!.text = "\(exercise.sets)x\(exercise.reps)"
cell.accessoryType = UITableViewCellAccessoryType.DisclosureIndicator
return cell
}
override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
if(editingStyle == .Delete ) {
// Find the Exercise object the user is trying to delete
let exerciseToDelete = exercises[indexPath.row]
// Delete it from the managedObjectContext
managedObjectContext?.deleteObject(exerciseToDelete)
// Refresh the table view to indicate that it's deleted
self.fetchExercises()
// Tell the table view to animate out that row
tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Automatic)
save()
}
}
// MARK: UITableViewDelegate
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
let exercise = exercises[indexPath.row]
}
let addExerciseAlertViewTag = 0
let addExerciseTextAlertViewTag = 1
@IBAction func addExerciseButton(sender: AnyObject) {
var namePrompt = UIAlertController(title: "Add Exercise",
message: "Enter Exercise Name",
preferredStyle: .Alert)
var exerciseNameTextField: UITextField?
namePrompt.addTextFieldWithConfigurationHandler {
(textField) -> Void in
exerciseNameTextField = textField
textField.placeholder = "Exercise Name"
}
namePrompt.addAction(UIAlertAction(title: "Ok",
style: .Default,
handler: { (action) -> Void in
if let textField = exerciseNameTextField {
self.saveNewItem(textField.text, workoutName: workouts.workoutName)
}
}))
self.presentViewController(namePrompt, animated: true, completion: nil)
}
func saveNewItem(exerciseName : String, workoutName: String) {
// Create the new exercise item
var newExercise = Exercises.createExerciseInManagedObjectContext(self.managedObjectContext!, exerciseName: exerciseName, workoutName: workoutName)
// Update the array containing the table view row data
self.fetchExercises()
// Animate in the new row
// Use Swift's find() function to figure out the index of the newExercise
// after it's been added and sorted in our Exercises array
if let newExerciseIndex = find(exercises, newExercise) {
// Create an NSIndexPath from the newExerciseIndex
let newExerciseIndexPath = NSIndexPath(forRow: newExerciseIndex, inSection: 0)
// Animate in the insertion of this row
tableView.insertRowsAtIndexPaths([ newExerciseIndexPath ], withRowAnimation: .Automatic)
save()
}
}
func save() {
var error : NSError?
if(managedObjectContext!.save(&error) ) {
println(error?.localizedDescription)
}
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {
if segue.identifier == "exerciseSettings" {
let ExerciseSettingsDetailViewController = segue.destinationViewController as UIViewController
let indexPath = tableView.indexPathForSelectedRow()!
let exercise = exercises[indexPath.row]
let destinationTitle = exercise.exerciseName
ExerciseSettingsDetailViewController.title = destinationTitle
}
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
此外,这是在我的练习类中定义的函数 createExerciseInManagedObjectContext 以添加新练习:
class func createExerciseInManagedObjectContext(moc: NSManagedObjectContext, exerciseName: String, workoutName: String) -> Exercises {
let newExercise = NSEntityDescription.insertNewObjectForEntityForName("Exercises", inManagedObjectContext: moc) as Exercises
newExercise.exerciseName = exerciseName
self.workouts.addObject(workoutName)
return newExercise
}
我可以将所选锻炼的字符串 (workoutName) 传递到此函数中,但不知道如何通过与锻炼实体的锻炼关系来设置它。
这是我的练习实体:
import Foundation
import CoreData
class Exercises: NSManagedObject {
@NSManaged var exerciseName: String
@NSManaged var sets: NSNumber
@NSManaged var reps: NSNumber
@NSManaged var repWeight: NSNumber
@NSManaged var barWeight: NSNumber
@NSManaged var incrementWeight: NSNumber
@NSManaged var workouts: NSSet
class func createExerciseInManagedObjectContext(moc: NSManagedObjectContext, exerciseName: String, workoutName: String) -> Exercises {
let newExercise = NSEntityDescription.insertNewObjectForEntityForName("Exercises", inManagedObjectContext: moc) as Exercises
newExercise.exerciseName = exerciseName
newExercise.workouts.setByAddingObject(workoutName)
return newExercise
}
}
这是我的锻炼实体:
import Foundation
import CoreData
class Workouts: NSManagedObject {
@NSManaged var workoutName: String
@NSManaged var sessions: NSSet
@NSManaged var exercises: NSSet
class func createWorkoutInManagedObjectContext(moc: NSManagedObjectContext, workoutName: String) -> Workouts {
let newWorkout = NSEntityDescription.insertNewObjectForEntityForName("Workouts", inManagedObjectContext: moc) as Workouts
newWorkout.workoutName = workoutName
return newWorkout
}
}
最佳答案
如果正确设置模型,两个实体将通过关系相互引用。您将实体添加到另一个实体,而不是它的名称(这是一个属性)。
当您创建 NSManagedObject
子类时,Core Data 应该会自动生成访问器。有了这些,向锻炼中添加新的(或现有的)锻炼就非常简单了:
workout.addExercisesObject(newExercise)
这假设您的关系称为练习
。
因此,将实际锻炼对象而不是其名称传递给函数实际上更可取。不要忘记保存。
编辑:
为了让它工作,你有两个选择。
或者让 Xcode 在 Objective-C 中生成 NSManagedObject 子类并自动配置桥接头。然后您可以毫不费力地获得访问器。
或者您必须自己实现它们。例如:
@objc(Exercise)
class Exercise: NSManagedObject {
@NSManaged var workouts: NSSet
func addWorkoutsObject(value: Workout!) {
var mutableWorkouts = self.workouts.mutableCopy() as! NSMutableSet
mutableWorkouts.addObject(value)
self.workouts = mutableWorkouts as NSSet
}
}
请注意,我没有添加键值编码调用,因此除非您添加它们,否则 KVO 将无法工作。
关于Swift - 为相关的 CoreData 实体赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28702369/
你能解释一下这个作业是如何完成的吗, var fe, f = document.forms[0], h; 哪个等于哪个。 最佳答案 以上等同于 var fe; var f = document.for
据我测试,这两种方法都有效,但我不知道哪一种最好,也不知道它们之间的区别,这就是我想知道的。 以下是两种方法: window.location = 'http://www.google.com'; w
我正在处理用字符串填充的 numpy 数组。我的目标是分配给第一个数组 a 的切片,值包含在较小尺寸的第二个数组 b 中。 我想到的实现如下: import numpy as np a = np.em
在我使用过的其他语言(如 Erlang 和 Python)中,如果我正在拆分字符串并且不关心其中一个字段,我可以使用下划线占位符。我在 Perl 中试过这个: (_,$id) = split('
我认为这似乎很简单,但我对调用、应用、绑定(bind)感到困惑。等等 我有一个事件监听器 red.addEventListener("click", function() { j = 0;
这个问题在这里已经有了答案: What is the python "with" statement designed for? (11 个答案) 关闭 7 年前。 使用有什么区别: iFile =
这个问题在这里已经有了答案: What is the python "with" statement designed for? (11 个答案) 关闭 7 年前。 使用有什么区别: iFile =
几周前我们开始写一篇关于 Haskell 的论文,刚刚接到我们的第一个任务。我知道 SO 不喜欢家庭作业问题,所以我不会问怎么做。相反,如果有人能将我推向正确的方向,我将不胜感激。鉴于它可能不是一个特
我正在尝试为我的函数的变量根分配一个值,但似乎不起作用。我不明白这个问题。 hw7.c:155:7:警告:赋值使指针来自整数而不进行强制转换[默认启用] root = 负载(&fp, 大小); 此代码
我昨天花了大约 5 个小时来完成这个工作,并使用这个网站的帮助让代码可以工作,但我认为我这样做的方式是一种作弊方式,我使用了 scanf 命令。无论如何,我想以正确的方式解决这个问题。多谢你们!哦,代
我需要一些帮助来解决问题。 我有这个文本文件: 我将文本内容输入到字符串二维数组中,并将其转换为整数二维数组。当我转换为 int 数组时,nan 被替换为零。现在,我继续查找二维数组中每行的最大值和最
假设我有一个只能移动的类型。我们停止现有的默认提供的构造函数,但 Rvalue 引用引入了一种新的“ flavor ”,我们可以将其用于签名的移动版本: class CantCopyMe { priv
假设我有两个简单的对象,我想创建第三个对象来连接它们的属性。这非常有效: (()=>{ const a1 = {a: 2, b: 3} const b1 = {a: 100, c: 5}
我想知道我是否可以稍后在这样的代码中为 VAR 赋值 var myView: UIView func createView() { myView = UIView() { let _view =
我遇到了一些 Javascript/HTML/CSS 代码的问题。我对创建网站还很陌生,所以请多多包涵。 我最终想做的是从 javascript 中提取一个动态值并使用它对一些 div(在容器中)进行
#include class Box{ public: int x; Box(){ x=0; std::cout No move construction thanks to RV
我发现在javascript中&=运算符是按位赋值: var test=true; test&=true; //here test is an int variable javascript中是否存在
请帮助完成赋值重载函数的执行。 这是指令: 赋值运算符 (=),它将源字符串复制到目标字符串中。请注意,目标的大小需要调整为与源相同。 加法 (+) 和赋值 (=) 运算符都需要能够进行级联运算。这意
我有一个名为 SortedArrayList 的自定义结构它根据比较器对其元素进行排序,我想防止使用 operator[] 进行分配. 示例: 数组列表.h template class Array
我是 python 的新手,我看到了这种为列表赋值的形式 color= ['red' if v == 0 else 'green' for v in y] 但是如果我尝试用 3 个数字来做,例如 co
我是一名优秀的程序员,十分优秀!