0

グリッドを設定するさまざまな配列に画像をロードすることに関連して、特定のコードが思い通りに機能しない理由を解決するのを手伝ってくれることを願っていました。

私のプログラムには 16 個の正方形 (button1、button2 などと呼ばれる) のグリッドがあり、それぞれに画像があり、基本的に黒の画像、白の画像、または緑の画像のいずれかになります (黒/白の画像は同じです)すべてのタイルにまたがるが、個々の緑のタイル (現在、32 個の固有のものがあります)。ユーザーが画面上の「次へ」または「前へ」ボタンを使用して別のレベルを選択すると、以前に配列に保存されたものに応じて、16 個のアイコンが適切なアイコンでロードされるという考え方です。

したがって、基本的に、アイコンに 1 ~ 16 のラベルが付いている場合、次のレベルは 17 ~ 32 などになります。レベル 1 からレベル 2 に移動するとき、現在画面に表示されている画像を level1part1 という配列に保存し、次に配列 level1part2 の内容を同じ正方形にロードします。レベル 2 からレベル 1 に戻ると、画面上の画像を level1part2 に保存してから、level1part1 配列の内容を画面上の 16 タイルに読み込みます。

したがって、最初に画面がロードされると、viewDidLoad メソッドに次の宣言があります。

UIImage *def = [UIImage imageNamed:@"silhouette.png"];
level1part1 = [[NSMutableArray alloc]initWithObjects:def, def, def, def, def, def, def, def, def, def, def, def, def, def, def, def, nil];
level1part2 = [[NSMutableArray alloc]initWithObjects:def, def, def, def, def, def, def, def, def, def, def, def, def, def, def, def, nil];
currentArray = [[NSMutableArray alloc]initWithObjects:def, def, def, def, def, def, def, def, def, def, def, def, def, def, def, def, nil];

def は黒のイメージです。現在の配列の使用方法については、すぐに説明します。

以下で説明する pressPreviousLevel と pressNextLevel という 2 つのメソッドがあります。

- (IBAction)pressNextLevel:(UIButton *)sender {

NSMutableArray *nextLevelArray;

if (currentlevel == 1)
{
    nextLevelArray = level1part2.mutableCopy;
    [self.nextLevel setHidden:YES];
}

次の画面に投影する画像の内容を保持する nextLevelArray という名前の NSMutableArray を宣言します。この場合、level1 から level2 に移動するため、level1part2 です。

//// SAVING IMAGES ON SCREEN TO CURRENTARRAY
[currentArray replaceObjectAtIndex:0 withObject: button1.imageView.image];
[currentArray replaceObjectAtIndex:1 withObject: button2.imageView.image];
[currentArray replaceObjectAtIndex:2 withObject: button3.imageView.image];
[currentArray replaceObjectAtIndex:3 withObject: button4.imageView.image];

次に、前に宣言した currentArray 配列に、現在画面に表示されているものを入力します。

if (currentlevel == 1)
{
    level1part1 = currentArray.mutableCopy;
}

そして、私はレベル 1 にいるので、level1part1 をこの currentArray と等しくしたいと言います。画面上の内容をこの level1part1 配列に効果的に保存します。

次に、level1part2 の内容を画面上の 16 個のタイルにロードします。

// REPLACE IMAGES WITH PREVIOUS LEVELS IMAGES FROM ARRAY 
button1.imageView.image = [nextLevelArray objectAtIndex:0];
button2.imageView.image = [nextLevelArray objectAtIndex:1];
button3.imageView.image = [nextLevelArray objectAtIndex:2];
button4.imageView.image = [nextLevelArray objectAtIndex:3];

currentlevel ++;

そして現在のレベルを上げます。

pressPreviousLevel についても同様のことが起こります。

- (IBAction)pressPreviousLevel:(UIButton *)sender {

NSMutableArray *previousLevelArray;

if (currentlevel == 2)
{
    previousLevelArray = level1part1.mutableCopy;
    [self.previousLevel setHidden:YES];
    [self.nextLevel setHidden:NO];
}

/// SAVING IMAGES ON SCREEN TO CURRENTARRAY
[currentArray replaceObjectAtIndex:0 withObject: button1.imageView.image];
[currentArray replaceObjectAtIndex:1 withObject: button2.imageView.image];
[currentArray replaceObjectAtIndex:2 withObject: button3.imageView.image];
[currentArray replaceObjectAtIndex:3 withObject: button4.imageView.image];

残りのタイルなど。したがって、現在レベル 2 にいる場合 (そこから戻ることができないため、レベル 1 にはなれません)、この場合は level1part1 の内容を保持する previousLevelArray という名前の NSMutableArray を宣言します。次に、画面に表示されている 16 個の画像すべてを currentArray に保存します。

if (currentlevel == 2)
{
    level1part2 = currentArray.mutableCopy;
}

ここで、現在どのレベルにいるのかを尋ね、現在の配列を保存します。この配列には、画面からのすべてのアイコンが含まれている必要があります。この場合は、level1part2 である必要があります。

// REPLACE IMAGES WITH PREVIOUS LEVELS IMAGES FROM ARRAY
button1.imageView.image = [previousLevelArray objectAtIndex:0];
button2.imageView.image = [previousLevelArray objectAtIndex:1];
button3.imageView.image = [previousLevelArray objectAtIndex:2];
button4.imageView.image = [previousLevelArray objectAtIndex:3];

currentlevel --;

最後に、画像を previousLevelArray (この場合は level1part1) から画面にロードし直します。

だから、私の問題はこれです-レベル1の最初のアイコンが緑色のアイコン(GREEN1と呼びましょう)であるとしましょう-これはそのレベルのそのタイルに固有のものです-[次へ]を押すと、画面に黒いアイコンが表示されます。私が欲しいものです。ただし、この次のレベルで最初のアイコンをもう一度クリックすると、GREEN1 アイコンに変わります。レベル 2 からレベル 1 に移動すると、レベル 1 の最初のアイコンがレベル 2 の最初のアイコンに変わります。

アイコンをクリックして画像を変更する方法は何もないので、問題はこのコードにあると確信しています。基本的には画面に正しいアイコンが表示されていますが、アイコンをクリックすると、前の画面の情報の一部がまだ保持されているかのように、読み込みが完了していないかのように見えます。

私の質問は、この問題につながる可能性のあるコードで起こっていることを誰か見つけられるでしょうか? 問題がコードのどこにもないことは確かです。これを正しく機能させるには、上に出力したコードを簡単に修正します。

事前に助けてくれてありがとう - ここに「悪いコード」がある場合は、私に知らせてください - いつでも学びたいと思っています - 私は Objective C を使ったのは短期間だけです。

4

1 に答える 1

2

ボタンの画像を使用-setImage:forState:または設定する必要があります。-setBackgroundImage:forState:

UIControlStateNormal、UIControlStateHighlighted、UIControlStateSelected など、コントロールの状態ごとに異なる画像を設定できます。

于 2012-06-09T19:48:29.260 に答える