0

動物の画像を含む配列、対応する動物の音を含む別の配列、および動物の名前を含む最後の配列があります。例えば:

imagesArray:

0:[UIImage imageNamed:@"Elephant.png"]
1:[UIImage imageNamed:@"Dog.png"]
2:[UIImage imageNamed:@"Cat.png"]

soundArray:

0:Elephant.mp3
1:Dog.mp3
2:Cat.mp3

wordsArray:

0:象
1:犬
2:猫

それらは同期されており、同じカウンターで動作します。最初はそれらを新しい3つの配列にランダムに配置したいのですが、同じ動物の詳細(画像、音、または単語)を3つの配列すべてで同じにしたいのです。たとえば、新しいアレイは次のようになります。

imagesArray:

0:[UIImage imageNamed:@"Cat.png"]
1:[UIImage imageNamed:@"Dog.png"]
2:[UIImage imageNamed:@"Elephant.png"]

soundArray:

0:Cat.mp3
1:Dog.mp3
2:Elephant.mp3

wordsArray:

0:猫
1:犬
2:象

私はこのコードをビューに書き込んでロードしました:

theNewAnimalsPicture = [NSArray arrayWithObjects:[UIImage imageNamed:@"Square_Bee.png"],[UIImage imageNamed:@"Square_Bird.png"],[UIImage imageNamed:@"Square_Cat.png"],[UIImage imageNamed:@"Square_Chicken.png"],[UIImage imageNamed:@"Square_Cow.png"],[UIImage imageNamed:@"Square_Dog.png"],[UIImage imageNamed:@"Square_Elephant.png"],[UIImage imageNamed:@"Square_Frog.png"],[UIImage imageNamed:@"Square_Horse.png"],[UIImage imageNamed:@"Square_Lion.png"],[UIImage imageNamed:@"Square_Monkey.png"],[UIImage imageNamed:@"Square_Sheep.png"], nil];
theNewAnimalsSound = [NSArray arrayWithObjects:@"Bee.mp3",@"Bird.mp3",@"Miao.mp3",@"Chicken.mp3",@"Cow.mp3",@"Waff.mp3",@"Elephant2.mp3",@"Frog.mp3",@"Horse.mp3",@"LionSound.mp3",@"Monkey_Sound.mp3",@"Sheep.mp3", nil];
theNewAnimalsWord = [NSArray arrayWithObjects:@"Bee",@"Bird",@"Cat",@"Chicken",@"Cow",@"Dog",@"Elephant",@"Frog",@"Horse",@"Lion",@"Monkey",@"Sheep", nil];

for (int i =0;i<[theNewAnimalsPicture count];i++)
{
    int number = arc4random() % [theNewAnimalsPicture count];
    [PicturesAnimalArray addObject:[theNewAnimalsPicture objectAtIndex:number]];
    [SoundsAnimalArray addObject:[theNewAnimalsSound objectAtIndex:number]];
    [wordAnimalArray addObject:[theNewAnimalsWord objectAtIndex:number]];
    [theNewAnimalsPicture removeObjectAtIndex:number];
    [theNewAnimalsSound removeObjectAtIndex:number];
    [theNewAnimalsWord removeObjectAtIndex:number];
}

動作していません。それはなぜですか、そしてどうすればここで行ったよりも効率的な方法でこれを行うことができますか?

4

3 に答える 3

3

ここで行う最善のことは、1つの単語、音、および画像をカプセル化するクラスを作成することです。

Animal.h

@interface Animal : NSObject
{
}

@property (nonatomic, retain) UIImage *picture;
@property (nonatomic, copy) NSString *word;
@property (nonatomic, copy) NSString *soundFile;

+ animalWithPicture:(UIImage *) aPicture word:(NSString *) aWord soundFile:(NSString *) aSoundFile;
- initWithPicture:(UIImage *) aPicture word:(NSString *) aWord soundFile:(NSString *) aSoundFile;

@end

Animal.m

#import "Animal.h"

@implementation Animal
@synthesize picture = _picture;
@synthesize word = _word;
@synthesize soundFile = _soundFile;

+ animalWithPicture:(UIImage *) aPicture word:(NSString *) aWord soundFile:(NSString *) aSoundFile
{
    return [[[self alloc] initWithPicture:aPicture word:aWord soundFile:aSoundFile] autorelease];
}

- initWithPicture:(UIImage *) aPicture word:(NSString *) aWord soundFile:(NSString *) aSoundFile
{
    self = [super init];
    if (!self) return nil;
    
    // WARNING, make sure you understand the side effects of using
    // the property accessor methods during "init" and "dealloc".
    // In this case, there should be no issue.
    
    self.picture = aPicture;
    self.word = aWord;
    self.soundFile = aSoundFile;
    
    return self;
}

- (void) dealloc
{
    self.picture = nil;
    self.word = nil;
    self.soundFile = nil;
    [super dealloc];
}

@end

次に、各動物オブジェクトを含む単一の配列を作成するだけで済みます。ここで行ったように値をハードコーディングするのではなく、動物情報をplistファイルに保存することも検討してください。

NSMutableArray *animals = [NSMutableArray array];

[animals addObject:[Animal animalWithPicture:[UIImage imageNamed:@"Square_Bee.png"] word:@"Bee" soundFile:@"Bee.mp3"]];
// ... etc ...
[animals addObject:[Animal animalWithPicture:[UIImage imageNamed:@"Square_Sheep.png"] word:@"Sheep" soundFile:@"Sheep.mp3"]];

initおよびでアクセサメソッドを使用する理由については、この回答deallocを参照してください。

于 2012-05-14T20:44:55.743 に答える
1

それを行う別の方法は、「動物」のような新しいオブジェクトを作成することです。画像、音、名前の3つのプロパティを持つAnimalオブジェクト。

次に、単一の配列を使用して、動物オブジェクトを配列に追加できます。次に、アレイを繰り返し処理します。

于 2012-05-14T20:38:29.460 に答える
1
  1. 画像データを配列に直接保存しません。代わりに、画像ファイル名を保存できます。
  2. 配列からオブジェクトを削除すると、インデックスが再作成されます。

NSDictionaryを使用して、画像ファイル名、音声ファイル名、および単語の組み合わせセットを保存できます。

サンプルコード:

#define kImageFileName   @"ImageFileName"
#define kSoundFileName     @"SoundFileName"
#define kWord           @"Word" 


NSDictionary *animalRecord = [[NSDictionary alloc]initWithObjectsAndKeys:
                              @"Square_Bee.png", kImageFileName,
                              @"bee.mp3", kSoundFileName,
                              @"Bee", kWord,                              
                              nil];

NSMutableArray *myArray = [[NSMutableArray alloc]init];
[myArray addObject:animalRecord];
// you would need to create some kind of loop and create animalRecord and add it to your myArray for all your picture/sound/word comnination sets.


//To retreive each record
int i = 0; // for example
NSString *imageFileName = [[myArray objectAtIndex:i] objectForKey:kImageFileName];  //with the filename, you can can the image whenever you need
NSString *soundFileName = [[myArray objectAtIndex:i] objectForKey:kSoundFileName];
NSString *word  = [[myArray objectAtIndex:i] objectForKey:kWord];

//to rearrange myArray's objects in random order, try this


 // This piece of code is from this [SO][1]
NSUInteger count = myArray.count;
for (NSUInteger i = 0; i < count; ++i) 
{
    // Select a random element between i and end of array to swap with.
    int nElements = count - i;
    int n = (arc4random() % nElements) + i;
    [myArray exchangeObjectAtIndex:i withObjectAtIndex:n];
}

配列再配置SOへのリンク

于 2012-05-14T20:55:55.803 に答える