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 :).
问题:
回答1:
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
Don’t forget to connect delegates
and IBOutlet
from interface builder.
回答2:
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;