Xcode 使用核心数据保存CGPoint

Xcode 使用核心数据保存CGPoint,xcode,core-data,cgpoint,Xcode,Core Data,Cgpoint,我使用核心数据保存添加到标签的文本,每个标签都在视图中,可以移动。我目前正在用一个字符串实体保存文本,效果很好。移动视图时,如何使用核心数据保存视图的CGPoint,然后在再次打开视图时将其加载回保存的位置 代码如下 -CGPoint firstTouchPoint; //xd = distance between image center and my touch center float xd; float yd; @implementation BlankViewController

我使用核心数据保存添加到标签的文本,每个标签都在视图中,可以移动。我目前正在用一个字符串实体保存文本,效果很好。移动视图时,如何使用核心数据保存视图的CGPoint,然后在再次打开视图时将其加载回保存的位置

代码如下

 -CGPoint firstTouchPoint;

//xd = distance between image center and my touch center
float xd;
float yd;

@implementation BlankViewController
-(BOOL)prefersStatusBarHidden
{
    return YES;
}
@synthesize name;


-(NSManagedObjectContext *)managedObjectContext {
    NSManagedObjectContext *context = nil;
    id delegate = [[UIApplication sharedApplication] delegate];
    if ([delegate performSelector:@selector(managedObjectContext)]) {
        context = [delegate managedObjectContext];
    }
    return context;
}

(IBAction)save:(id)sender {


    NSManagedObjectContext *context = [self managedObjectContext];


    if (self.name) {
        [self.name setValue:self.nameTextField.text forKey:@"name"];
        [self.name setValue:self.Label1.text forKey:@"label1"];
        [self.name setValue:self.Label2.text forKey:@"label2"];
}
else{
        // Create a new managed object
        NSManagedObject *newName = [NSEntityDescription insertNewObjectForEntityForName:@"Maths" inManagedObjectContext:context];
        [newName setValue:self.nameTextField.text forKey:@"name"];
        [newName setValue:self.Label1.text forKey:@"label1"];
        [newName setValue:self.Label2.text forKey:@"label2"];
}

- (void)viewDidLoad {
    [super viewDidLoad];
 if (self.name) {
        [self.nameTextField setText:[self.name valueForKey:@"name"]];
        [self.Label1 setText:[self.name valueForKey:@"label1"]];
        [self.Label2 setText:[self.name valueForKey:@"label2"]];  }}


Code to move the views:


-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch* bTouch = [touches anyObject];
    if ([bTouch.view isEqual:[self imgTest]]) {
        firstTouchPoint = [bTouch locationInView:[self view]];
        xd = firstTouchPoint.x - [[bTouch view]center].x;
        yd = firstTouchPoint.y - [[bTouch view]center].y;
        [self.view bringSubviewToFront:self.imgTest];
    }
    else if ([bTouch.view isEqual:[self imgTest2]]) {
        firstTouchPoint = [bTouch locationInView:[self view]];
        xd = firstTouchPoint.x - [[bTouch view]center].x;
        yd = firstTouchPoint.y - [[bTouch view]center].y;
        [self.view bringSubviewToFront:self.imgTest2];
    }
}
-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch* mTouch = [touches anyObject];
    if (mTouch.view == [self imgTest]) {
        CGPoint cp = [mTouch locationInView:[self view]];
        [[mTouch view]setCenter:CGPointMake(cp.x-xd, cp.y-yd)];
    }
    else if (mTouch.view == [self imgTest2]) {
        CGPoint cp = [mTouch locationInView:[self view]];
        [[mTouch view]setCenter:CGPointMake(cp.x-xd, cp.y-yd)];
    }
}

如果您只需要在实体中存储一个
CGPoint
,我将向您的实体添加两个必需的浮点属性(例如
x
y
),并像这样存储点


使用最新的Xcode,您可以让它为您生成模型对象,这比处理普通的
NSManagedObject
更容易。使用该模型对象,还可以轻松添加一个类别,该类别定义了一个
属性,您可以使用该属性将核心数据属性转换为
CGPoint
,反之亦然

这真的是对核心数据的良好利用吗?是不是太过了?考虑<代码> CGPointFromString(<:)/代码> />代码nStrugFulcMcGoPoT(<:)/Cord>。计算属性在它是一个吸气剂时工作正常,例如当FulnNeX是第一个+最后一个名字的吸气剂时,但是当你必须支持一个设置器问题时。计算属性需要一个影响键的值方法,这对于getter来说很好,但是对于setter来说,当x和y都改变时,它会导致point属性的KVO通知,然后您必须尝试合并通知,这样就不会在每次点改变时都更新两次,这是非常痛苦的。如果你克服了这一点,那么你将在撤销和子上下文中遇到更多的问题。