2010-08-27 3 views
0

J'ai un NSMutableArray J'essaie de remplir en utilisant un for-loop et en faisant NSStrings pour cela. Ceux-ci doivent être la source de données pour mon UIPickerView. Vous verrez quelques lignes commentées où j'ai fait manuellement NSArrays et ils se sont montrés bien, mais mon for-loopNSMutableArray ne semble pas accepter les chaînes que je fais. Le NSLogs montrent que je fais la chaîne (et un équivalent float) bien, mais le NSLogs qui tirent les valeurs de la NSMutableArray apparaissent comme null et 0.0Pourquoi NSMutableArray n'est-il pas rempli?

L'interface ...


// PoolSizePickerViewController.h 

#import <UIKit/UIKit.h> 
#define kLengthComponent 0 
#define kWidthComponent 1 
#define kDepthComponent 2 

@protocol PoolSizePickerViewControllerDelegate; 

@interface PoolSizePickerViewController : UIViewController <UIPickerViewDelegate, UIPickerViewDataSource> { 
    UIPickerView *poolSizePicker; 
    float length, width, depth; 
    NSMutableArray *lengthStrings, *widthStrings, *depthStrings; 
    NSMutableArray *lengthFloats, *widthFloats, *depthFloats; 
    NSString *pickerType; 
    NSString *pickerDescription; 
    UIButton *selectButton; 
    UIButton *cancelButton; 
    UILabel *pickerTitleLabel; 
    UITextView *pickerDescriptionLabel; 
    id <PoolSizePickerViewControllerDelegate> delegate; 
} 

@property (nonatomic, retain) IBOutlet UIPickerView *poolSizePicker; 
@property float length, width, depth; 
@property (nonatomic, retain) NSMutableArray *lengthStrings, *widthStrings, *depthStrings; 
@property (nonatomic, retain) NSMutableArray *lengthFloats, *widthFloats, *depthFloats; 
@property (nonatomic, retain) NSString *pickerType; 
@property (nonatomic, retain) NSString *pickerDescription; 
@property (nonatomic, retain) IBOutlet UIButton *selectButton; 
@property (nonatomic, retain) IBOutlet UIButton *cancelButton; 
@property (nonatomic, retain) IBOutlet UILabel *pickerTitleLabel; 
@property (nonatomic, retain) IBOutlet UITextView *pickerDescriptionLabel; 
@property (assign) id <PoolSizePickerViewControllerDelegate> delegate; 

- (IBAction)selectedSelectButton; 
- (IBAction)selectedCancelButton; 

@end 

@protocol PoolSizePickerViewControllerDelegate <NSObject> 

@optional 

- (void)poolSizePickerViewController:(PoolSizePickerViewController *)controller 
       didSelectLength:(float)length 
         andWidth:(float)width 
         andDepth:(float)depth; 

- (void)poolSizePickerViewController:(PoolSizePickerViewController *)controller 
       didSelectCancel:(BOOL)didCancel; 

@end 

Et la mise en œuvre ...


// PoolSizePickerViewController.m 

#import "PoolSizePickerViewController.h" 

@implementation PoolSizePickerViewController 

@synthesize poolSizePicker; 
@synthesize length, width, depth; 
@synthesize lengthStrings, widthStrings, depthStrings; 
@synthesize lengthFloats, widthFloats, depthFloats; 
@synthesize delegate; 
@synthesize pickerType, pickerDescription; 
@synthesize selectButton, cancelButton; 
@synthesize pickerTitleLabel; 
@synthesize pickerDescriptionLabel; 

- (IBAction)selectedSelectButton { 
    NSInteger lengthRow = [poolSizePicker selectedRowInComponent:kLengthComponent]; 
    NSInteger widthRow = [poolSizePicker selectedRowInComponent:kWidthComponent]; 
    NSInteger depthRow = [poolSizePicker selectedRowInComponent:kDepthComponent]; 
    length = [[self.lengthFloats objectAtIndex:lengthRow] floatValue]; 
    width = [[self.widthFloats objectAtIndex:widthRow] floatValue]; 
    depth = [[self.depthFloats objectAtIndex:depthRow] floatValue]; 
    if ([self.delegate respondsToSelector:@selector (poolSizePickerViewController:didSelectLength:andWidth:andDepth:)]) { 
     [self.delegate poolSizePickerViewController:self didSelectLength:length andWidth:width andDepth:depth]; 
    } 
} 

- (IBAction)selectedCancelButton { 
    if ([self.delegate respondsToSelector:@selector (poolSizePickerViewController:didSelectCancel:)]) { 
     [self.delegate poolSizePickerViewController:self didSelectCancel:YES]; 
    } 
} 


- (void)viewDidLoad { 
    for (int footIndex = 6; footIndex < 40; footIndex ++) { 
     for (int inchIndex = 0; inchIndex < 2; inchIndex ++) { 
      [self.lengthStrings addObject:[NSString stringWithFormat:@" %d' %d\"", footIndex, inchIndex * 6]]; 
      NSLog(@" %d' %d\"", footIndex, inchIndex * 6); 
      NSLog(@" -%@", [self.lengthStrings objectAtIndex:footIndex - 6]); 
      [self.lengthFloats addObject:[NSNumber numberWithFloat:(float)footIndex + (float)inchIndex * 0.5f]]; 
      NSLog(@" %1.1f", (float)footIndex + (float)inchIndex * 0.5f); 
      NSLog(@" -%1.1f", [[self.lengthFloats objectAtIndex:footIndex - 6] floatValue]); 
     } 
    } 
    for (int footIndex = 6; footIndex < 40; footIndex ++) { 
    for (int inchIndex = 0; inchIndex < 2; inchIndex ++) { 
      [self.widthStrings addObject:[NSString stringWithFormat:@" %d' %d\"", footIndex, inchIndex * 6]]; 
      [self.widthFloats addObject:[NSNumber numberWithFloat:(float)footIndex + (float)inchIndex * 0.5f]]; 
     } 
    } 
    for (int footIndex = 1; footIndex < 16; footIndex ++) { 
     for (int inchIndex = 0; inchIndex < 2; inchIndex ++) { 
      [self.depthStrings addObject:[NSString stringWithFormat:@" %d' %d\"", footIndex, inchIndex * 6]]; 
      [self.depthFloats addObject:[NSNumber numberWithFloat:(float)footIndex + (float)inchIndex * 0.5f]]; 
     } 
    } 

// lengthStrings = [NSArray arrayWithObjects:@" 6' 0\"", nil]; 
// lengthFloats = [NSArray arrayWithObjects:[NSNumber numberWithFloat:1.0], nil]; 
// widthStrings = [NSArray arrayWithObjects:@" 6' 0\"", nil]; 
// widthFloats = [NSArray arrayWithObjects:[NSNumber numberWithFloat:2.0], nil]; 
// depthStrings = [NSArray arrayWithObjects:@" 1' 0\"", nil]; 
// depthFloats = [NSArray arrayWithObjects:[NSNumber numberWithFloat:3.0], nil]; 

    UIImage *buttonImageNormal = [UIImage imageNamed:@"whiteButton.png"]; 
    UIImage *stretchableButtonImageNormal = [buttonImageNormal stretchableImageWithLeftCapWidth:12 topCapHeight:0]; 
    [selectButton setBackgroundImage:stretchableButtonImageNormal forState:UIControlStateNormal]; 
    [cancelButton setBackgroundImage:stretchableButtonImageNormal forState:UIControlStateNormal]; 
    UIImage *buttonImagePressed = [UIImage imageNamed:@"blueButton.png"]; 
    UIImage *stretchableButtonImagePressed = [buttonImagePressed stretchableImageWithLeftCapWidth:12 topCapHeight:0]; 
    [selectButton setBackgroundImage:stretchableButtonImagePressed forState:UIControlStateHighlighted]; 
    [cancelButton setBackgroundImage:stretchableButtonImagePressed forState:UIControlStateHighlighted]; 
    pickerTitleLabel.text = [NSString stringWithFormat:@"Select a Pool %@", pickerType]; 
    pickerDescriptionLabel.text = self.pickerDescription; 
    self.poolSizePicker.showsSelectionIndicator = YES; 
    [super viewDidLoad]; 
} 

- (void)didReceiveMemoryWarning { 
    [super didReceiveMemoryWarning]; 
} 

- (void)viewDidUnload { 
    [super viewDidUnload]; 
} 

- (void)dealloc { 
    [super dealloc]; 
} 

    #pragma mark - 
    #pragma mark Picker Data Source Methods 

- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView { 
return 3; 
} 

- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component { 
    switch (component) { 
     case kLengthComponent: 
      return [self.lengthStrings count]; 
      break; 
     case kWidthComponent: 
      return [self.widthStrings count]; 
      break; 
     default: 
      return [self.lengthStrings count]; 
      break; 
    } 
} 

#pragma mark Picker Delegate Methods 

- (NSString *)pickerView:(UIPickerView *)pickerView 
     titleForRow:(NSInteger)row 
     forComponent:(NSInteger)component { 
    switch (component) { 
     case kLengthComponent: 
      return [self.lengthStrings objectAtIndex:row]; 
      break; 
     case kWidthComponent: 
      return [self.widthStrings objectAtIndex:row]; 
      break; 
     default: 
      return [self.depthStrings objectAtIndex:row]; 
      break; 
    } 
} 

@end 

Répondre

3

Etes-vous en train d'initialiser vos baies quelque part? Je ne vois pas de [[NSMutableArray alloc] init] partout. L'envoi d'un message à un objet nul est un no-op, il est donc probable que ces addObjects soient envoyés à un null et ne fassent rien.

+0

Cela a du sens. Je me suis conditionné à 'allouer' aussi peu que possible! Mais comment cela a-t-il fonctionné avec les tableaux manuels? Y a-t-il quelque chose de différent à propos de '[NSMutableArray addObject:]' par opposition à '[NSArray arrayWithObjects:]'? Et le @property (nonatomic, retain) ne les initialise-t-il pas? Je vais essayer 'alloc' et' init' dans 'viewDidLoad' et ensuite les libérer dans' dealloc' ... – Steve

+1

@Steve, [NSArray arrayWithObjects:] est égal à [[[NSArray alloc] initWithObjects:] autorelease]. – vfn

+0

Garçon Je souhaite qu'il y ait une référence de ce qui est autoreleased! Je passe beaucoup de temps dans la documentation d'Apple, mais je ne mentionne pas le statut autorelease ici. Merci! – Steve

Questions connexes