我有问题。 这是我的代码。 当我尝试使用IBAction SavePosition时,“arrayPosition”不会更新。 否则,如果我在“SavePosition”中初始化“arrayPosition”,则该值将存储在数组中。 为什么会出现这种异常?
#import <UIKit/UIKit.h>
@interface AccelerometroViewController : UIViewController <UIAccelerometerDelegate, UITextFieldDelegate, UIAlertViewDelegate>{
//.....
NSMutableArray *arrayPosizioni;
NSMutableArray *arrayPosizioniCorrenti;
NSString *nomePosizioneCorrente;
}
-(IBAction)salvaPosizione;
//...
@property (nonatomic, assign) NSMutableArray *arrayPosizioni;
@property (nonatomic, assign) NSMutableArray *arrayPosizioniCorrenti;
@property (nonatomic, assign) NSString *nomePosizioneCorrente;
@end
#import "AccelerometroViewController.h"
#import "Position.h"
@implementation AccelerometroViewController
float actualX;
float actualY;
float actualZ;
@synthesize arrayPosition;
@synthesize arrayCurrentPosition;
@synthesize nameCurrentPosition;
-(id)init {
self = [super init];
if (self != nil) {
arrayPosition = [[NSMutableArray alloc]init];
arrayCurrentPosition = [[NSMutableArray alloc]init];
nameCurrentPosition = [NSString stringWithFormat:@"noPosition"];
actualX = 0;
actualY = 0;
actualZ = 0;
}
return self;
}
-(void)updateTextView:(NSString*)nomePosizione
{
NSString *string = [NSString stringWithFormat:@"%@", nameCurrentPosition];
textEvent.text = [textEvent.text stringByAppendingString:@"\n"];
textEvent.text = [textEvent.text stringByAppendingString:string];
}
-(IBAction)savePosition{
Posizione *newPosition;
newPosition = [[Position alloc]init];
if([newPosition setValue:(NSString*)fieldNomePosizione.text:(float)actualX:(float)actualY:(float)actualZ]){
//setValue is a method of Position. I'm sure that this method is correct
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Salvataggio Posizione" message:@"Posizione salvata con successo" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:nil];
[alert show];
[alert release];
[arrayPosition addObject:newPosition];
}
else{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Salvataggio osizione" message:@"Errore nel salvataggio" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:nil];
[alert show];
[alert release];
}
}
答案 0 :(得分:4)
怎么回事?
我打赌你在xib文件中创建视图控制器?
如果在行上的init方法中设置断点
arrayPosition = [[NSMutableArray alloc]init];
我打赌它永远不会运行。这意味着当你到达 p>行时
[arrayPosition addObject:newPosition];
arrayPosition仍为nil
,所以没有任何反应。
如何解决?
如果你正在初始化一个UIViewController,它可以在initWithNibName:bundle中调用:如果你在代码或initWithCoder中创建它:如果它是在xib文件中创建的。
你需要做这样的事情:
- (void) initialise {
arrayPosition = [[NSMutableArray alloc] init];
arrayCurrentPosition = [[NSMutableArray alloc] init];
nameCurrentPosition = @"noPosition";
actualX = 0;
actualY = 0;
actualZ = 0;
}
- (id)initWithNibName:(NSString *)nibName bundle:(NSBundle *)nibBundle {
if (self = [super initWithNibName:nibName bundle:bundle]) {
[self initialise];
}
return self;
}
- (id)initWithCoder:(NSCoder *)decoder {
if (self = [super initWithCoder:decoder]) {
[self initialise];
}
return self;
}
无论视图控制器是如何创建的,都会调用initailise。
答案 1 :(得分:0)
此:
[newPosition setValue:(NSString*)fieldNomePosizione.text:(float)actualX:(float)actualY:(float)actualZ]
......是胡言乱语。我甚至不知道它是如何编译的。我认为这是一个错字。但是,如果函数没有返回布尔值,它将返回一个void指针并始终求值为false,因此永远不会调用该块。
更一般地说,您的问题很可能是您没有使用self.propertyName
表示法来引用您的属性,因此不会保留它们。 E.g。
[arrayPosition addObject:newPosition];
应该是:
[self.arrayPosition addObject:newPosition];
...代码中对arrayPosition
的所有其他引用也应如此。