0

更新しました:

UIImageView をサブクラス化して、タッチ ジェスチャで一部の画像を移動できるようにしました。ビューコントローラーには、各イメージビューの初期位置を保持する配列があります。私の問題は、この配列がサブクラスから呼び出されるたびに null を返すことです。アイデアは、画像が元の位置にあるかどうか、または以前に移動されているかどうかを確認することです。コードを削除して、何が起こっているのかを NSLog だけにしましたが、問題は残り、気が狂います。

ViewController.h

NSMutableArray *originalPositions;
@property (nonatomic, retain) NSMutableArray *originalPositions;
-(void)testLogging;

ViewController.m

@synthesize originalPositions;

- (void)viewDidLoad {
originalPositions = [[NSMutableArray alloc]init];
}

-(void)drawImages {
for (int i = 0; i < imagesArray.count; i++) {
 CGRect frame = CGRectMake(65 * i, 10, 60, 60);
 draggableView *dragImage = [[draggableView alloc] initWithFrame:frame];

   NSString* imgName = [imagesArray objectAtIndex:i];
    [dragImage setImage:[UIImage imageNamed:imgName]];
    [dragImage setUserInteractionEnabled:YES];
   [self.view addSubview:dragImage];

   NSString *originalPositionAsString = NSStringFromCGPoint(dragImage.center);
   [originalPositions addObject:originalPositionAsString];
}
}
-(void)testLogging {
NSLog(@"Logging array: %@", originalPositions);
}

-(IBAction)btnClicked {
[self testLogging];
}

クラスの IBAction (またはその他の方法) から呼び出されると、「testLogging」メソッドは配列を正しく NSLogs しますが、サブクラスから同じメソッドを呼び出すと、NSLogs null になります。

Subclass.m

- (void)touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event {
ViewController *viewController = [[ViewController alloc] init];
[viewController testLogging];
}
4

2 に答える 2

0
self.originalPositions = [[NSMutableArray alloc]init];

これはすでにメモリリークです。self.originalPositions=blaを呼び出すと、「bla」が保持されます。したがって、保持カウントが増加することを意味します。これは、可変配列の保持カウントが2になり、UIImageViewがなくなるとリークすることを意味します。

残りの部分については、コードの何が問題になっているのかわかりません。私の最初の推測では、populatePositionsArrayはまだ呼び出されていません。ビューが作成/表示されるたびにこれを呼び出す必要があります。これにより、touchesBeganが呼び出されたときに配列にデータが入力されます。

または、touchesBeganに「if」ステートメントを含めて、配列が存在するかどうかを確認するか、続行する前にpopulatePositionsArrayを呼び出して配列を設定することもできます。

于 2012-05-12T08:42:29.510 に答える
0

配列を作成した後、配列をplistファイルに書き込むことで解決しました。あまりエレガントではありませんが、機能しています。

みんな助けてくれてありがとう。

于 2012-05-13T09:25:22.257 に答える