初始化问题

时间:2010-05-28 12:51:00

标签: iphone objective-c

我有问题。 这是我的代码。 当我尝试使用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];
        }
   }

2 个答案:

答案 0 :(得分:4)

怎么回事?

我打赌你在xib文件中创建视图控制器?

如果在行上的init方法中设置断点

arrayPosition = [[NSMutableArray alloc]init];

我打赌它永远不会运行。这意味着当你到达行时

[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的所有其他引用也应如此。