0

正常に動作しているアプリ内で画像を移動しています。問題は、ユーザーがそのビューに戻ったときに画像をそのままにしておきたいということです。現在、画像の中心を保持するために文字列を使用しています。

NSString *centre = NSStringFromCGPoint(image.center);

theCentre と呼ばれる NSUserDefault 変数があります。

theCentre = [NSUserDefaults standardUserDefaults];

以下を使用して保存しようとしています:

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

ログを出力すると、次のようになります。

{280, 320}

これは素晴らしいことです。viewDidLoad で、まったく同じログを試しましたが、(null) が返されます。これは、theCentre が適切に保存されていないことを意味していると思います。アプリの他の場所で 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];

}
4

1 に答える 1

2

NSUserDefaultsに保存されたデータは最初にキャッシュされるため、NSUserDefaults の他のインスタンスからすぐには利用できません。データは、いくつかの事前定義されたイベント/時間間隔で定期的に保存されます。ただし、次のようにsynchronizeを呼び出すことで、データの同期を強制することができます。

NSString *theCenter = NSStringFromCGPoint(image.center);
theCenter = [NSUserDefaults standardUserDefaults];
[theCenter setObject:centre forKey:@"center"];
[theCenter synchronize];
于 2012-05-07T17:32:34.147 に答える