NSUserDefault Update Formula

2019-09-21 22:10发布

Have a question on how can I update my formula by NSUserDefault. So I have two text field which needs to keep my Formula uptodate. So the user types in there number (value) then that numbers needs to go to my formula but the formula only showing me the distance value :).

2条回答
Bombasti
2楼-- · 2019-09-21 22:32

I think the problem may lie here:

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

You are writing out to your NSUserDefaults directly from your textField.text, often with 0.00 formatting, but you are reading it in as an int. It is stored as a NSString likely. You should store and read it as a NSNumber.

Going In:

NSNumber *foo = [NSNumber numberWithInteger:TextGas.text.integerValue];
NSNumber *bar = [NSNumber numberWithDouble:TextMoney.text.doubleValue];    
[defaults setObject:foo forKey:@"Gas"];
[defaults setObject:bar forKey:@"Money"];

Coming out:

NSNumber *gas = [[NSUserDefaults standardUserDefaults] objectForKey:@"Gas"];
NSNumber *money =  [[NSUserDefaults standardUserDefaults] objectForKey:@"Money"];
gas.integerValue;
money.doubleValue;
查看更多
Anthone
3楼-- · 2019-09-21 22:37

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

查看更多
登录 后发表回答