[Solved] NSUserDefault Update Formula


I tried your code with some changes. Here are my .h file and .m files. Try this. Now also I didn’t understand what your trying to find out, but this code gives me the values not a nan. While you writing code, don’t forget to start your variable name in small letter that is a standard way. And also use self if you set a variable as property.

ViewController.h

#import <UIKit/UIKit.h>
#import <MapKit/MapKit.h>
#import <CoreLocation/CoreLocation.h>

@interface ViewController : UIViewController
<UITextFieldDelegate,CLLocationManagerDelegate>{
    IBOutlet MKMapView *mapView;
    IBOutlet UITextField *textGas;
    IBOutlet UITextField *textMoney;
    IBOutlet UITextField *textTotal;
    IBOutlet UITextField *textDistance;
}

@property (nonatomic, retain) CLLocationManager *locationManager;
@end

ViewController.m

 #import "ViewController.h"



    @interface ViewController ()
    {
        double totalDistance;
        float gas,money;
    }
    @end

    @implementation ViewController
    @synthesize locationManager;


    - (void)viewDidLoad
    {
        [super viewDidLoad];
        self.locationManager = [[CLLocationManager alloc] init];
        self.locationManager.delegate = self;
        self.locationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters;
        [self.locationManager startUpdatingLocation];

//set default value for Gas
        if (![[NSUserDefaults standardUserDefaults] objectForKey:@"Gas"]) {
            [[NSUserDefaults standardUserDefaults] setObject:@"1.0" forKey:@"Gas"];
            [[NSUserDefaults standardUserDefaults] synchronize];
        }

//set default value for Money
        if (![[NSUserDefaults standardUserDefaults] objectForKey:@"Money"]) {
            [[NSUserDefaults standardUserDefaults] setObject:@"1.0" forKey:@"Money"];
            [[NSUserDefaults standardUserDefaults] synchronize];
        }

        gas = [[[NSUserDefaults standardUserDefaults] objectForKey:@"Gas"] floatValue];
        money =  [[[NSUserDefaults standardUserDefaults] objectForKey:@"Money"] floatValue];

        textGas.text = [NSString stringWithFormat:@"%.1f",gas];
        textMoney.text = [NSString stringWithFormat:@"%.1f",money];

        // Do any additional setup after loading the view, typically from a nib.
    }

    -(void)viewDidAppear:(BOOL)animated
    {
        [super viewDidAppear:animated];
        if ([[NSUserDefaults standardUserDefaults] objectForKey:@"Gas"])
            textGas.text = [[NSUserDefaults standardUserDefaults] objectForKey:@"Gas"];
        else
            textGas.text = @"0";//set default value

        if ([[NSUserDefaults standardUserDefaults] objectForKey:@"Money"])
            textMoney.text = [[NSUserDefaults standardUserDefaults] objectForKey:@"Money"];
        else
            textMoney.text = @"0.01";//set default value



    }

    -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
    {
        [textMoney resignFirstResponder];
        [textGas resignFirstResponder];
    }

    - (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex
    {
        if (buttonIndex == 1)
        {
            exit(0);
        }
        if (buttonIndex == 0) {
            [self.locationManager stopUpdatingLocation];
            mapView.showsUserLocation = NO;
        }

    }
    #pragma mark - UITextFieldDelegate
    -(void)textFieldDidEndEditing:(UITextField *)textField
    {

        if ([textField.text intValue] == 0) {
            textGas.text = [NSString stringWithFormat:@"%.1f",gas];
            textMoney.text = [NSString stringWithFormat:@"%.1f",money];
            UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@""
                                                            message:@"Value cann't be zero."
                                                           delegate:self
                                                  cancelButtonTitle:@"OK"
                                                  otherButtonTitles:nil];
            [alert show];
            alert = nil;
            return;
        }

        if (![textField.text length]) {
            textGas.text = [NSString stringWithFormat:@"%.1f",gas];
            textMoney.text = [NSString stringWithFormat:@"%.1f",money];
            UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@""
                                                            message:@"Value cann't be empty."
                                                           delegate:self
                                                  cancelButtonTitle:@"OK"
                                                  otherButtonTitles:nil];
            [alert show];
            alert = nil;
            return;
        }

        NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
        if (textField == textGas) {
            [defaults setObject:textGas.text forKey:@"Gas"];
            gas = [textGas.text floatValue];
        }
        else if (textField == textMoney)
        {
            [defaults setObject:textMoney.text forKey:@"Money"];
            money = [textMoney.text floatValue];
        }
        [defaults synchronize];
    }

    - (BOOL) textFieldShouldReturn:(UITextField *)textField
    {
        [textField resignFirstResponder];
        return YES;
    }

    #pragma mark -
    #pragma mark CLLocationManagerDelegate Methods

    - (void)locationManager:(CLLocationManager *)manager
        didUpdateToLocation:(CLLocation *)newLocation
               fromLocation:(CLLocation *)oldLocation {
        {
            // Zoom to the current user location.
            MKCoordinateRegion userLocation = MKCoordinateRegionMakeWithDistance(newLocation.coordinate, 1200.0, 1200.0);
            [mapView setRegion:userLocation animated:NO];
            mapView.showsUserLocation = YES;
        }



        if (!oldLocation)
            totalDistance = 0.0;
        else
            totalDistance += [newLocation distanceFromLocation:oldLocation];


        double distance = totalDistance*0.00062137119;
        textTotal.text = [[ NSString alloc] initWithFormat:@"$%.2f", distance/gas*money];
        textDistance.text = [NSString stringWithFormat:@"%.2f Miles", distance];

    }


    - (void)didReceiveMemoryWarning
    {
        [super didReceiveMemoryWarning];
        // Dispose of any resources that can be recreated.
    }
    @end

And the result in Simulator is
result in Simulator

Don’t forget to connect delegates and IBOutlet from interface builder.this is how you can check the delegate connection

21

solved NSUserDefault Update Formula