0
我有一個NSMutableArray
我想填充使用for-loop
併爲其製作NSStrings
。這些將成爲我的UIPickerView
的數據源。您會看到一些註釋掉的行,我手動製作了NSArrays
,並且它們顯示正常,但我的for-loop
NSMutableArray
似乎不接受我製作的字符串。該NSLogs
證明我做的字符串(和等效float
)好了,但NSLogs
從NSMutableArray
拉動值顯示爲null
和0.0
爲什麼不是這個NSMutableArray得到填充?
接口...
// 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
和實現...
// 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
這很有道理。我已經儘可能少地限制了自己的'alloc'!但是它如何與手動數組一起工作呢?與[NSArray arrayWithObjects:]'相對,'[NSMutableArray addObject:]'有什麼不同嗎?而不是'@property(nonatomic,retain)'初始化它們?我會在'viewDidLoad'中嘗試'alloc'和'init',然後在'dealloc'中釋放它們... – Steve 2010-08-27 02:34:23
@Steve,[NSArray arrayWithObjects:]等於[[[NSArray alloc] initWithObjects:] autorelease]。 – vfn 2010-08-27 03:04:36
男孩我希望有一個什麼得到autoreleased參考!我花了很多時間在Apple文檔中,但是我沒有提及那裏的autorelease狀態。謝謝! – Steve 2010-08-27 04:07:00