NSUserDefault更新公式

有一个问题,我怎么能通过NSUserDefault更新我的公式。 所以我有两个文本字段需要保持我的公式uptodate。 所以用户input数字(值),然后该数字需要去我的公式,但公式只显示距离值:)。

我试了一下你的代码。 这是我的.h文件和.m文件。 尝试这个。 现在我也不明白你想要发现什么,但是这段代码给了我不值得的值。 在编写代码时,不要忘记以小写字母开始variables名,这是一种标准的方法。 如果您将variables设置为属性,也可以使用self

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 

而模拟器的结果是 导致模拟器

不要忘记从接口构build器连接delegatesIBOutlet这是如何检查委托连接

我认为这个问题可能在这里:

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

你直接从你的textField.text中写出你的NSUserDefaults ,通常为0.00格式,但是你正在以intforms读取它。 它可能被存储为NSString 。 你应该存储和读取它作为一个NSNumber

进入:

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

出来:

 NSNumber *gas = [[NSUserDefaults standardUserDefaults] objectForKey:@"Gas"]; NSNumber *money = [[NSUserDefaults standardUserDefaults] objectForKey:@"Money"]; gas.integerValue; money.doubleValue; 
Interesting Posts