2012-05-12 1 views
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:

サブクラスm

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

コードが何をしているのか分かりません - まず 'populatePositionsArray'を呼び出す必要がありますが、あなたが投稿するスニペットはこれをしません。initで' populatePositionsArray'を呼び出すことができます。おそらく – Axel

+0

Axelは正しいです、populatePositionsArrayが一度呼び出され、classの初期化が行われていることを確認する必要があります。 – rishi

答えて

0

私はそれを移植した後plistファイルに配列を書き込むことによって解決しました。それほどエレガントではないが働いている

助けてくれてありがとうございます。

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

これは既にメモリリークです。self.originalPositions = blaを呼び出すと、 'bla'が保持されます。つまり、保持カウントがアップされたことを意味します。これは、可変配列の保持カウントが2で、UIImageViewがなくなるとリークすることを意味します。

残りについては、コードに何が間違っているかわかりません。私の最初の推測はあなたがpopulatePositionsArrayをまだ呼び出さなかったことでしょう。あなたのビューが作成/表示されるたびにthisを呼び出して、touchesBeganが呼び出されたときに配列が設定されていることを確認してください。

touchesBeganに配列が存在するかどうかをチェックするif文を含めることもできます。そうでなければ、populatePositionsArrayを呼び出して続行する前にpopulatePositionsArrayを呼び出すことができます。

+0

populatePositionsArrayは親ビューのviewdidloadで呼び出され、NSLogは配列を正しく返します。私が次に行うことは、私が正しく投稿した次のスニペットをトリガーするビューの1つに触れることですが、配列は空です。サブクラスにinitメソッドを挿入すると違いがありますか? – oskare

+0

コードが重複していないか確認してください。インスタンスを再割り当てすると、空の配列が得られるだけです。 –

+0

私は問題を切り分けたので、上記の質問を更新しました。重複はありません。ありがとう。 – oskare

関連する問題