-1

したがって、私の問題は、転送配列が正しく初期化されていないことです。transfer = [[NSMutableArray alloc] init]; をどこに置くべきですか?

@interface PictureViewController (){

    Poi *labelPoi;

}

@end

@implementation PictureViewController
@synthesize imageX;
@synthesize imageY;
@synthesize name;
@synthesize transfer;


- (id)init
{
    self = [super init];
    if(self) {
        transfer = [[NSMutableArray alloc] init];
    }
    return self;
}
-(id)initWithLabel:(double)imageX andY:(double)imageY withName:(NSString *)name{
    self = [super init];
    if(self){

       // transfer = [[NSMutableArray alloc] init];

        self.imageX = imageX;
        self.imageY = imageY;
        self.name = name;
    }

    return self;
}


/*-(id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];

    if(self){

        transfer = [[NSMutableArray alloc] init];

        self.imageX = imageX;
        self.imageY = imageY;
        self.name = name;
        NSLog(@"imageX: %f", self.imageX);
        NSLog(@"imageY: %f", imageY);
        NSLog(@"name: %@", name);

    }
    return self;
}*/

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.

    NSLog(@"transfer count: %lu",(unsigned long)transfer.count);
    for(int i = 0; i < transfer.count; i++){
        UILabel *label =  [[UILabel alloc] initWithFrame: CGRectMake([[transfer objectAtIndex:i] imageLocationX], [[transfer objectAtIndex:i] imageLocationY], 200, 50)];
        label.text = [[transfer objectAtIndex:i] name];
        label.font = [UIFont systemFontOfSize:14];
        label.backgroundColor = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.0];
        [self.view addSubview:label];
        NSLog(@"asdfasdsd");
    }
}


- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}



- (id)display:(double)imageXX andY:(double)imageYY withName:(NSString *)namee{
    NSLog(@"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%");
    NSLog(@"imageX: %f",imageXX);
    NSLog(@"imageY: %f", imageYY);
    NSLog(@"name: %@", namee);

    labelPoi = [[Poi alloc] init];
    //transfer = [[NSMutableArray alloc] init];
    labelPoi.imageLocationX = imageXX;
    labelPoi.imageLocationY = imageYY;
    labelPoi.name = namee;
    [transfer addObject:labelPoi];
    NSLog(@"label.x: %f should be: %f", labelPoi.imageLocationX, imageXX);
    NSLog(@"label.y: %f should be: %f", labelPoi.imageLocationY, imageYY);
    NSLog(@"label.name: %@ should be: %@",labelPoi.name,namee);
    NSLog(@"transssssfer: %lu", (unsigned long)transfer.count);

    NSLog(@"asfddfsaasfdfdsfsd %f", [[transfer objectAtIndex:0] imageLocationX]);

    return self;
}

@end

Poi オブジェクトは imageLocationX、imageLocationY、および name で構成されており、Poi オブジェクトを transfer という名前の配列に入れようとしていますが、transfer 要素にアクセスしようとすると、0 または null が返されます。(id)display 関数が、その関数の別のビュー NSMutable alloc から数回呼び出されているため、配列がリセットされます。

出力は次のとおりです。

2013-07-19 11:22:06.736 AR_UAV_App[12466:11303] %%%%%%%%%%%%%%%%%%%%%%%%
2013-07-19 11:22:06.736 AR_UAV_App[12466:11303] imageX: 224.485718
2013-07-19 11:22:06.736 AR_UAV_App[12466:11303] imageY: 116.353401
2013-07-19 11:22:06.736 AR_UAV_App[12466:11303] name: Beutel Student Health Center
2013-07-19 11:22:06.736 AR_UAV_App[12466:11303] label.x: 224.485718 should be: 224.485718
2013-07-19 11:22:06.736 AR_UAV_App[12466:11303] label.y: 116.353401 should be: 116.353401
2013-07-19 11:22:06.736 AR_UAV_App[12466:11303] label.name: Beutel Student Health Center should be: Beutel Student Health Center
2013-07-19 11:22:06.737 AR_UAV_App[12466:11303] transssssfer: 0
2013-07-19 11:22:06.737 AR_UAV_App[12466:11303] asfddfsaasfdfdsfsd 0.000000
2013-07-19 11:22:06.737 AR_UAV_App[12466:11303] #############################################################

編集: .h ファイル

@interface PictureViewController : UIViewController{
    NSMutableArray *transfer;
}

@property (nonatomic) double imageX;
@property (nonatomic) double imageY;
@property (nonatomic) NSString *name;

@property (nonatomic,retain) NSArray *transfer;
- (IBAction)backView:(id)sender;
- (IBAction)load:(id)sender X:(double)imageX andY:(double)imageY withName:(NSString *)name;

-(id)initWithLabel:(double)imageX andY:(double)imageY withName:(NSString *)name;
-(id)display:(double)imageX andY:(double)imageY withName:(NSString *)name;
@end
4

4 に答える 4

2

この init メソッドは、「指定された」初期化子になる必要があります。

-(id)initWithLabel:andY:withName:(NSString *)name

(ちなみに、命名規則に従って正しく命名されていません)

指定された初期化子は、インスタンスを適切に初期化するものとします (つまり、あなたの場合、レイジー アクセサーを使用しない限り、配列transferを初期化する可能性があります)。

「指定されたイニシャライザ」は、ほとんどの場合、「最も特化した」イニシャライザです。つまり、最も多くのパラメータを持つイニシャライザです。ほとんどの場合、簡単に識別できる指定イニシャライザは1 つだけです。

「指定された初期化子」には、標準的な形式があります。

-(id)initWithLabel:(double)imageX andY:(double)imageY withName:(NSString *)name{
    self = [super init];
    if(self){
        // initialization
        ...
    }
}

メソッドのような他の init メソッドは、次のようinitに指定されたイニシャライザを呼び出します。

- (id)init {
    return [self initWithLabel:0 andY:0 withName:@""];
}
于 2013-07-19T17:06:08.210 に答える
-1

プロパティを作成し (合成して @synthesize transfer=_transfer;)、次のような遅延インスタンス化を使用します。

-(NSMutableArray*)transfer
{
   if (!_transfer)
   {
       _transfer=[NSMutableArray array];
   }

   return _transfer;
}

そしてそれをあなたのinitから取り出します

于 2013-07-19T18:04:20.083 に答える