我试图创建一个NSMutableArray,当按下按钮时,它会添加一个浮点数(转换为NSInteger)。该按钮连接到timerViewController,它的实现文件中的代码块如下(你可以忽略if语句来解决这个问题):
- (IBAction)timeSaveButton:(UIButton *)sender {
if ([self.timerStartOrStop.titleLabel.text isEqual: @"Start"]){
RecordedTimes *myTimes = [[RecordedTimes alloc] init];
[myTimes addANewTime: self.timerTime];
}
}
" RecordedTimes"它引用的类有NSMutableArray和" addANewTime"在.h文件中声明的方法
@interface RecordedTimes : NSObject
@property (nonatomic) NSMutableArray *recordedTimes;
-(void)addANewTime: (float) timerTime;
@end
其实施文件是
@implementation RecordedTimes
-(void) addANewTime:(float)timerTime{
NSMutableArray *myTimes = [[NSMutableArray alloc] init];
[myTimes addObject:[NSString stringWithFormat:@"%f", timerTime]];
}
@end
问题在于每次保存新时间时,阵列都会清空并仅存储最新的timerTime。我知道这是因为我的viewController(和addANewTime方法)每次初始化数组,导致它擦除其内容。如何解决这个问题以及在哪里初始化数组是我感到困惑的地方。
请在回复中详细说明。我是XCode和Objective-C的新手。感谢。
答案 0 :(得分:2)
您已声明名为NSMutableArray
的{{1}}属性,但从未将其初始化为空数组。在方便的地方,比如recordedTimes
方法,你可以初始化它:
init
然后将- (id)init {
self = [super init];
if (self) {
self.recordedTimes = [[NSMutableArray alloc] init];
}
return self;
}
更改为:
addANewTime:
这确保您的可变数组属性初始化一次(因为初始化对象时调用- (void)addANewTime:(float)timerTime{
[self.recordedTimes addObject:[NSString stringWithFormat:@"%f", timerTime]];
}
一次),然后每次调用init
时追加到数组的末尾。
此外,每次调用addANewTime:
方法时,您都会重新创建RecordedTimes
对象。您将要遵循相同的模式,并将其作为属性存储在视图控制器的类中,然后在timeSaveButton:
方法之类的地方设置一次。
除此之外:您可能已经注意到您无法在{{viewDidLoad
(或通常是原语,非对象类型)中存储int
1}}对象。您可以考虑将NSMutableArray
转换为timerTime
并NSNumber
并将其存储在数组中而不是字符串中。
答案 1 :(得分:1)
要初始化属性,我通常在以下任一位置执行:
在视图控制器的viewDidLoad
方法中。
(void)viewDidLoad {
[super viewDidLoad];
self.recordedTimes = [[NSMutableArray alloc] init];
}
或懒惰在您需要时初始化它,在这种情况下,当您第一次添加它时:
-(void) addANewTime:(float)timerTime {
if (!self.recordedTimes) {
self.recordedTimes = [[NSMutableArray alloc] init];
}
[self.recordedTimes addObject:[NSString stringWithFormat:@"%f", timerTime]];
}
另外,你做错了几件事:
addANewTime
后会被解除分配。相反,您应该声明一个@property
,只要viewController(或具有该属性的对象)处于活动状态,就可以使您的数组保持活动状态。@property (nonatomic) NSMutableArray *recordedTimes;
做到这一点,但实际上你应该使用它,而不是局部变量。答案 2 :(得分:0)
if ()
{
RecordedTimes *myTimes = [[RecordedTimes alloc] init];
}
myTimes
实例仅在if {}
语句中有效。
-(void) addANewTime:(float)timerTime
{
NSMutableArray *myTimes = [[NSMutableArray alloc] init];
}
此外,myTimes
实例仅在addNewTime:
方法中有效。
这就是为什么它似乎每次都要初始化。