2010-07-27 48 views
0

我有一个方法来产生一些字符串的基础上,我从我的选择器控制器模式提出的一些变量的值。我把值返回到委托方法中,我可以成功地将它们赋给我的视图控制器中的一些属性。当我调用我的方法来进行更新时,我通过NSLog将值发送到控制台,并且它们在那里也显示得很好。但是,如果我在方法结尾处放置断点并在NSLogs之下查看它们的值,则悬停消息将显示out of scope为什么我的属性超出范围?

编辑:我继续前进,并添加了其余的头部和实施。也许有人可以看到


#import <UIKit/UIKit.h> 
#import "SourcePickerViewController.h" 
#import "Chemical.h" 

@interface AdjustViewController : UIViewController <SourcePickerViewControllerDelegate>{ 
// IB controls 
    UITextField *sourceField; 
    UITextField *volumeField; 
    UILabel *startingLabel; 
    UILabel *targetLabel; 
    UITextView *adviceLabel; 
// Setup variables for the kind of chemical 
    int numberOfComponents; 
    NSDictionary *dictionaryOfSources; 
// Local ivars 
    float percentRemove; 
    float gallonsRemove; 
    float selectedChemSourceAmount; 
    int delta; 
    NSString *selectedChemName; 
    NSString *selectedChemConcentration; 
    float selectedChemConstant; 
    BOOL selectedChemIsLiquid; 
    NSString *compositeName; 
    NSString *messageBody; 
    NSString *adviceMessage; 

} 

@property (nonatomic, retain) IBOutlet UITextField *sourceField; 
@property (nonatomic, retain) IBOutlet UITextField *volumeField; 
@property (nonatomic, retain) IBOutlet UILabel *startingLabel; 
@property (nonatomic, retain) IBOutlet UILabel *targetLabel; 
@property (nonatomic, retain) IBOutlet UITextView *adviceLabel; 

@property (nonatomic, retain) NSString *selectedChemName; 
@property (nonatomic, retain) NSString *selectedChemConcentration; 
@property float selectedChemConstant; 
@property BOOL selectedChemIsLiquid; 
@property (nonatomic, retain) NSString *compositeName; 
@property (nonatomic, retain) NSString *messageBody; 
@property (nonatomic, retain) NSString *adviceMessage; 

@property int numberOfComponents; 
@property (nonatomic, retain) NSDictionary *dictionaryOfSources; 

- (IBAction)backgroundTap:(id)sender; 
//- (IBAction)textFieldDoneEditing:(id)sender; 
- (IBAction)startingSliderChanged:(id)sender; 
- (IBAction)startingSliderFinishedChanging; 
- (IBAction)targetSliderChanged:(id)sender; 
- (IBAction)targetSliderFinishedChanging; 
- (IBAction)getChemicalSource; 
- (void)updateAdvice; 

@end 

#import "AdjustViewController.h" 

@implementation AdjustViewController 

@synthesize sourceField; 
@synthesize volumeField; 
@synthesize startingLabel; 
@synthesize targetLabel; 
@synthesize adviceLabel; 
@synthesize numberOfComponents; 
@synthesize dictionaryOfSources; 
@synthesize compositeName; 
@synthesize messageBody; 
@synthesize adviceMessage; 
@synthesize selectedChemName; 
@synthesize selectedChemConcentration; 
@synthesize selectedChemConstant; 
@synthesize selectedChemIsLiquid; 

- (IBAction)backgroundTap:(id)sender { 
    [sourceField resignFirstResponder]; 
    [volumeField resignFirstResponder]; 
    [self updateAdvice]; 
} 

- (IBAction)startingSliderChanged:(id)sender { 
    UISlider *slider = (UISlider *)sender; 
    int progressAsInt = (int)(slider.value + 0.5f); 
    NSString *newValue = [[NSString alloc] initWithFormat:@"%d", progressAsInt]; 
    startingLabel.text = newValue; 
    [newValue release]; 
} 

- (IBAction)targetSliderChanged:(id)sender { 
    UISlider *slider = (UISlider *)sender; 
    int progressAsInt = (int)(slider.value + 0.5f); 
    NSString *newValue = [[NSString alloc] initWithFormat:@"%d", progressAsInt]; 
    targetLabel.text = newValue; 
    [newValue release]; 
} 

- (IBAction)startingSliderFinishedChanging { 
// [self updateAdvice]; 
} 

- (IBAction)targetSliderFinishedChanging { 
// [self updateAdvice]; 
} 


// Present the picker for chlorine selection 
- (IBAction)getChemicalSource { 
    SourcePickerViewController *sourcePickerViewController = [[SourcePickerViewController alloc] init]; 
    sourcePickerViewController.delegate = self; 
    NSLog(@"getChemicalSource setting numberOfComponents %d", self.numberOfComponents); 
    sourcePickerViewController.numberOfComponents = self.numberOfComponents; 
    NSLog(@"getChemicalSource sending numberOfComponents %d", sourcePickerViewController.numberOfComponents); 
    sourcePickerViewController.dictionaryOfSources = self.dictionaryOfSources; 
    [self presentModalViewController:sourcePickerViewController animated:YES]; 
    [sourcePickerViewController release]; 
} 

- (void)updateAdvice { 
    NSLog(@"--updateAdvice"); 
    NSLog(@" selectedChemical name = %@", selectedChemName); 
    NSLog(@" selectedChemical concentration = %@", selectedChemConcentration); 
    NSLog(@" selectedChemical constant = %1.6f", selectedChemConstant); 
    NSLog(@" selectedChemical is liquid = %d", selectedChemIsLiquid); 
// First check to see if there is a source AND volume, otherwise prompt user to enter them 
if ([volumeField.text isEqualToString:@""] || [sourceField.text isEqualToString:@""]) { 
    adviceMessage = @"Enter a source and volume."; 
} 
// If there IS a source and volume, calculate! 
else { 
    if ([selectedChemConcentration isEqualToString:@""]) { // If there's no concentration, make a string with just the name 
    compositeName = selectedChemName; 
    NSLog(@" compositeName without concentration = %@", compositeName); 
    } 
    else { // But if there is a concentration, make a string with the name and concentration and a space between. 
    compositeName = [[NSString alloc] initWithFormat:@"%@ %@", selectedChemName, selectedChemConcentration]; 
    NSLog(@" compositeName with concentration = %@ %@", compositeName, selectedChemConcentration); 
    } 
    delta = [targetLabel.text intValue] - [startingLabel.text intValue]; // The difference between target and starting levels 
    NSLog(@" delta = %d", delta); 
    sourceAmount = delta * [volumeField.text intValue] * sourceConstant; // Calculates the amount of source chemical necessary in ounces 
    NSLog(@" sourceAmount = %1.1f", sourceAmount); 

// If delta is positive, add chemical 
    if (delta > 0) { 
    NSLog(@">> Delta > 0"); 
    if (selectedChemIsLiquid) { 
    if (sourceAmount > 128) { // Amount is more than a gallon 
    sourceAmount = sourceAmount/128; 
    messageBody = [[NSString alloc] initWithFormat:@"To increase %@ by %d ppm, add %1.1f gal of ", self.title, delta, sourceAmount]; 
    } 
    else { // Less than a gallon 
    messageBody = [[NSString alloc] initWithFormat:@"To increase %@ by %d ppm, add %1.1f fl oz of ", self.title, delta, sourceAmount]; 
    } 
    } 
    else { // Chemical is a solid 
    if (sourceAmount > 16) { // Amount is more than a pound 
    sourceAmount = sourceAmount/16; 
    messageBody = [[NSString alloc] initWithFormat:@"To increase %@ by %d ppm, add %1.1f lb of ", self.title, delta, sourceAmount]; 
    } 
    else { // Less than a pound 
    messageBody = [[NSString alloc] initWithFormat:@"To increase %@ by %d ppm, add %1.1f oz of ", self.title, delta, sourceAmount]; 
    } 
    } 
    adviceMessage = [[NSString alloc] initWithFormat:@"%@%@.", messageBody, compositeName]; 
    } 
// If delta is zero, stay the course 
    if (delta == 0) { 
    NSLog(@"== Delta = 0"); 
    adviceMessage = @"You're on target. No action necessary."; 
    } 
// If delta is negative, remove water 
    if (delta < 0) { 
      NSLog(@"<< Delta < 0"); 
    adviceMessage = @"You're over target. Remove some water."; 
    } 

} 
adviceLabel.text = adviceMessage; // Set the advice label 
[messageBody release]; // And get rid of message 
[compositeName release]; 
[adviceMessage release]; 
} 

- (void)viewDidLoad { 
    NSLog(@"AdjustViewController launched"); 
    sourceField.text = @""; 
    adviceLabel.text = @""; 
    percentRemove = 0; 
    gallonsRemove = 0; 
    delta = 0; 
    selectedChemSourceAmount = 0; 
// [self updateAdvice]; 
    [super viewDidLoad]; 
} 

- (void)didReceiveMemoryWarning { 
    // Releases the view if it doesn't have a superview. 
    [super didReceiveMemoryWarning]; 

    // Release any cached data, images, etc that aren't in use. 
} 

- (void)viewDidUnload { 
    sourceField = nil; 
    volumeField = nil; 
    startingLabel = nil; 
    targetLabel = nil; 
    adviceLabel = nil; 
    dictionaryOfSources = nil; 
    [super viewDidUnload]; 
    // Release any retained subviews of the main view. 
    // e.g. self.myOutlet = nil; 
} 

- (void)dealloc { 
    [sourceField release]; 
    [volumeField release]; 
    [startingLabel release]; 
    [targetLabel release]; 
    [adviceLabel release]; 
    [dictionaryOfSources release]; 
    [super dealloc]; 
} 

#pragma mark - 
#pragma mark Picker View Delegate Methods 

// Returns the values from the picker if a source was chosen 
- (void)sourcePickerViewController:(SourcePickerViewController *)controller 
        didSelectSource:(NSString *)source 
        andConcentration:(NSString *)concentration 
         andConstant:(float)constant 
         andIsLiquid:(BOOL)isLiquid { 

    selectedChemName = source; 
    selectedChemConcentration = concentration; 
    selectedChemConstant = constant; 
    selectedChemIsLiquid = isLiquid; 

// Update the source textfield. If concentration is empty, just use the source otherwise concatenate them  
    if ([selectedChemConcentration isEqualToString:@""]) { 
     sourceField.text = [[NSString alloc] initWithFormat:@"%@", selectedChemName]; 
    } 
    else { 
     sourceField.text = [[NSString alloc] initWithFormat:@"%@ %@", selectedChemName, selectedChemConcentration]; 
    } 
// [self updateAdvice]; 
    NSLog(@"Returned source = %@, concentration = %@, constant = %1.7f, isLiquid = %d", source, concentration, constant, isLiquid); 
    NSLog(@"selectedChemical.chemName = %@, chemConcentration = %@, chemConstant = %1.7f, chemIsLiquid = %d", selectedChemName, selectedChemConcentration, selectedChemConstant, selectedChemIsLiquid); 
    [self dismissModalViewControllerAnimated:YES]; 
} 

// Returns from the picker without choosing a new source 
- (void)sourcePickerViewController:(SourcePickerViewController *)controller 
        didSelectCancel:(BOOL)didCancel { 
// [self updateAdvice]; 
    NSLog(@"Returned without selecting source"); 
    [self dismissModalViewControllerAnimated:YES]; 
} 

@end 

回答

1

检查:Strange Descriptions for Arrays in XCode debugger

如果这是 像NSString的将不可用作为 很好的情况下,其他对象

+0

我确实在方法的最后设置了断点。我会尽早放一些,看看发生了什么。我知道字符串没有得到他们应该的值(零而不是实数),但也许这是我的逻辑。在这之前,我有一个'='vs'=='问题 - 这是对objective-c的新尝试的结果。 – Steve 2010-07-27 18:51:58

+0

我想我明白了为什么现在不工作。我曾经使用一个名为'sourceConstant'的变量,但是在试图从我的委托方法中获取东西的过程中,我创建了一组变量,这些变量都以'selecetedChem'开头,就像'selectedChemConstant',这就是我应该正在使用。我不认为'sourceConstant'被设置为任何东西了。你将无法从我的代码片段中看到它!我今晚会解决这个问题...... – Steve 2010-07-27 18:59:27

+0

太棒了!告诉我你是否可以修复它! :) – cesarnicola 2010-07-27 19:04:57

相关问题