2012-05-07 41 views
0

我在我的应用程序中移动图像,这是正常工作。问题是,当用户回到该视图时,我想保留这些图像。目前,我使用的是字符串来保存图像中心:使用NSUserDefaults来存储图像坐标

NSString *centre = NSStringFromCGPoint(image.center); 

我有一个NSUserDefault变量称为theCentre:

theCentre = [NSUserDefaults standardUserDefaults]; 

,我尝试使用保存:

[theCentre setObject:centre forKey:@"centre"]; 

当我输出日志时,我得到以下内容:

{280, 320} 

这很棒。 在viewDidLoad中,我尝试了完全相同的日志,并且它正在返回(null)。我认为这意味着它没有妥善保存中心。我在这里错过了一些基本的东西,因为我在我的应用程序的其他地方使用了NSUserDefaults,并且它一直工作正常。提前谢谢了。
编辑:这是整个代码,试图帮助调试:)

-(void)getBounds 
{ 
lowerBoundX = 250; 
upperBoundX = 310; 
lowerBoundY = 290; 
upperBoundY = 350; 

} 

#pragma mark - 
#pragma mark UIPanGestureRecognizer selector 

- (void) dragGesture:(UIPanGestureRecognizer *) panGesture 
{ 
[self getBounds]; 

CGPoint translation = [panGesture translationInView:self.view]; 

switch (panGesture.state) { 
    case UIGestureRecognizerStateBegan:{ 
     originalCentre = dragImage.center; 
    } 
     break; 
    case UIGestureRecognizerStateChanged:{ 
     dragImage.center = CGPointMake(dragImage.center.x + translation.x, 
             dragImage.center.y + translation.y); 

    } 
     break; 
    case UIGestureRecognizerStateEnded:{    
     if (((dragImage.center.x >= lowerBoundX) && (dragImage.center.y >= lowerBoundY) && 
      (dragImage.center.x <= upperBoundX) && (dragImage.center.y <= upperBoundY))) { 

      dragImage.center = CGPointMake(280, 320); 
      [dragImage setUserInteractionEnabled:NO]; 

      theCentre = [NSUserDefaults standardUserDefaults]; 

     NSString *centre = NSStringFromCGPoint(dragImage.center); 

      [theCentre setObject:centre forKey:@"centre"]; 

      NSLog(@"%@", [theCentre objectForKey:@"centre"]); 
      [theCentre synchronize]; 

      break; 
     } 
     [UIView animateWithDuration:0.5 
         animations:^{ 
          dragImage.center = originalCentre; 
         } 
         completion:^(BOOL finished){ 
         }]; 
    } 
     break; 
    default: 
     break; 
} 

[panGesture setTranslation:CGPointZero inView:self.view]; 
} 

-(IBAction)clear{ 
[UIImageView animateWithDuration:0.5 animations:^{ 
dragImage.center = CGPointMake(100, 200); 
}]; 

[dragImage setUserInteractionEnabled:YES]; 
} 

- (void)viewDidLoad 
{ 
[super viewDidLoad]; 
// Do any additional setup after loading the view. 

NSLog(@"%@", [theCentre objectForKey:@"centre"]); 

UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(dragGesture:)]; 

[dragImage addGestureRecognizer:panGesture]; 

[dragImage setUserInteractionEnabled:YES]; 

} 

回答

2

罗布,

保存在NSUserDefaults数据首先缓存,因此它即刻不是可以从NSUserDefaults的其他实例。数据按照一些预定义的事件/时间间隔定期保存。然而,你可以通过调用synchronize来强制数据同步:

NSString *theCenter = NSStringFromCGPoint(image.center); 
theCenter = [NSUserDefaults standardUserDefaults]; 
[theCenter setObject:centre forKey:@"center"]; 
[theCenter synchronize]; 

希望这有助于!

干杯, 帕维尔

+0

非常感谢你@Pawel,我实现了同步,但并没有改变任何东西。它也有意义!我将用整个代码编辑我的帖子,希望我能找到一个解决方案! –

+1

您确定theCenter属性包含任何NSUserDefaults对象吗?看起来你正在dragGesture:方法中创建一个,但我不确定是否为viewDidLoad方法创建了一个。 – Pawel

+0

我只将它作为一个变量,而不是一个属性;我错了吗? –