2011-12-27 5 views
0

私は、ユーザーがスロットマシンのようにUIPickerViewを回すことができるアプリケーションを構築しています。私が現時点で直面している問題は、実行時に私のpickerViewの画像がランダムに消え始めることです。その後、再びスピンし、そのうちのいくつかが戻ってきます。私のUIPickerViewからの画像は消えます

- (void)viewDidLoad{ 
    [super viewDidLoad]; 

    [drinkPickerView_ selectRow:1000 inComponent:0 animated:NO]; 
    [drinkPickerView_ selectRow:1000 inComponent:1 animated:NO]; 
    [drinkPickerView_ selectRow:1000 inComponent:2 animated:NO]; 

    if (managedObjectContext_ == nil) 
    { 
     managedObjectContext_ = [(AppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext]; 
    } 

    drinkPickerView_.delegate = self; 
    drinkPickerView_.dataSource = self; 

    UIImage *fris1 = [UIImage imageNamed:@"fris01.PNG"]; 
    UIImage *fris2 = [UIImage imageNamed:@"fris02.PNG"]; 
    UIImage *fris3 = [UIImage imageNamed:@"fris03.PNG"]; 
    UIImage *fris4 = [UIImage imageNamed:@"fris04.PNG"]; 
    UIImage *fris5 = [UIImage imageNamed:@"fris05.PNG"]; 

    UIImageView *frisView1 = [[UIImageView alloc]initWithImage:fris1]; 
    UIImageView *frisView2 = [[UIImageView alloc]initWithImage:fris2]; 
    UIImageView *frisView3 = [[UIImageView alloc]initWithImage:fris3]; 
    UIImageView *frisView4 = [[UIImageView alloc]initWithImage:fris4]; 
    UIImageView *frisView5 = [[UIImageView alloc]initWithImage:fris5]; 

    UIImage *alcoholisch1 = [UIImage imageNamed:@"alcohol01.PNG"]; 
    UIImage *alcoholisch2 = [UIImage imageNamed:@"alcohol02.PNG"]; 
    UIImage *alcoholisch3 = [UIImage imageNamed:@"alcohol03.PNG"]; 
    UIImage *alcoholisch4 = [UIImage imageNamed:@"alcohol04.PNG"]; 
    UIImage *alcoholisch5 = [UIImage imageNamed:@"alcohol05.PNG"];  

    UIImageView *alcoholischView1 = [[UIImageView alloc]initWithImage:alcoholisch1]; 
    UIImageView *alcoholischView2 = [[UIImageView alloc]initWithImage:alcoholisch2]; 
    UIImageView *alcoholischView3 = [[UIImageView alloc]initWithImage:alcoholisch3]; 
    UIImageView *alcoholischView4 = [[UIImageView alloc]initWithImage:alcoholisch4]; 
    UIImageView *alcoholischView5 = [[UIImageView alloc]initWithImage:alcoholisch5]; 

    UIImage *freaky1 = [UIImage imageNamed:@"freaky01.PNG"]; 
    UIImage *freaky2 = [UIImage imageNamed:@"freaky02.PNG"]; 
    UIImage *freaky3 = [UIImage imageNamed:@"freaky03.PNG"]; 
    UIImage *freaky4 = [UIImage imageNamed:@"freaky04.PNG"]; 
    UIImage *freaky5 = [UIImage imageNamed:@"freaky05.PNG"]; 

    UIImageView *freakyView1 = [[UIImageView alloc]initWithImage:freaky1]; 
    UIImageView *freakyView2 = [[UIImageView alloc]initWithImage:freaky2]; 
    UIImageView *freakyView3 = [[UIImageView alloc]initWithImage:freaky3]; 
    UIImageView *freakyView4 = [[UIImageView alloc]initWithImage:freaky4]; 
    UIImageView *freakyView5 = [[UIImageView alloc]initWithImage:freaky5]; 


    NSArray *frisImageArray = [[NSArray alloc]initWithObjects:frisView1,frisView2,frisView3,frisView4,frisView5, nil]; 

    NSArray *alcoholischImageArray = [[NSArray alloc]initWithObjects:alcoholischView1,alcoholischView2,alcoholischView3,alcoholischView4,alcoholischView5, nil]; 


    NSArray *freakyImageArray = [[NSArray alloc]initWithObjects:freakyView1,freakyView2,freakyView3,freakyView4,freakyView5, nil]; 


    NSString *frisFieldName = [[NSString alloc]initWithFormat:@"frisDrankenPlaatjesArray"]; 
    [self setValue:frisImageArray forKey:frisFieldName]; 


    NSString *alcoholischFieldName = [[NSString alloc]initWithFormat:@"alcoholischeDrankenPlaatjesArray"]; 
    [self setValue:alcoholischImageArray forKey:alcoholischFieldName]; 

    NSString *freakyFieldName = [[NSString alloc]initWithFormat:@"freakyDrankenPlaatjesArray"]; 
    [self setValue:freakyImageArray forKey:freakyFieldName]; 

} 

これはされています。ここ

が、私は画像の配列を作るために使用するコードです(私のプロジェクトで、私はそれを絞り込まれた空間のビットを保存するのではなく、すべての配列の17枚の画像があります)私はpickerViewで画像を読み込むコード:

-(UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row 
forComponent:(NSInteger)component reusingView:(UIView *)view{ 
    if (component==0) { 
     NSString *arrayName = [[NSString alloc]initWithFormat:@"alcoholischeDrankenPlaatjesArray"]; 
     NSArray *array = [self valueForKey:arrayName]; 
     return [array objectAtIndex:(row%5)]; 
    } 
    else if(component==1){ 
     NSString *arrayName = [[NSString alloc]initWithFormat:@"frisDrankenPlaatjesArray"]; 
     NSArray *array = [self valueForKey:arrayName]; 
     return [array objectAtIndex:(row%5)]; 

    } 
    else if (component==2){ 
     NSString *arrayName = [[NSString alloc]initWithFormat:@"freakyDrankenPlaatjesArray"]; 
     NSArray *array = [self valueForKey:arrayName]; 
     return [array objectAtIndex:(row%5)]; 
    } 
    else{ 
     return nil; 
    } 

} 

これはpickerViewスピンを行うコードです:

-(IBAction)rotate:(id)sender{ 

    int numInRow =1; 
    int lastVal = -1; 
    for (int i=0;i<3; i++) { 
     int newValue = arc4random()%1000; 
     if (newValue==lastVal) 
      numInRow++; 
     else 
      numInRow =1; 
     lastVal=newValue; 
     [drinkPickerView_ selectRow:newValue inComponent:i animated:YES]; 
     [drinkPickerView_ reloadComponent:i]; 

    }  
} 

これは十分な情報であり、誰かが私を助けてくれることを願っています。

+0

私は作成したアプリでギャラリービューを持っていました。そこにおそらく200-300 +の画像があります。私は2つの事柄に至るいくつかの奇妙な問題を抱えていた。画像のサイズは、2つの画像があり、残りの部分とメモリの問題に比べて巨大な場所です(多くの場合に使用します)。私はあなたの画像のどれもが非常に巨大であることをチェックしません。 「非常に巨大」ということを念頭に置くと、画像の90%が20kbであり、次に2〜5MBの画像がいくつかあります。 –

+0

返信ありがとうございますが、私の画像はすべて2〜5 KBですので、それが問題だとは思いません。 –

答えて

0

私は問題は、あなたのUIImagesを初期化するところで産むと思う

UIImage *fris1 = [UIImage imageNamed:@"fris01.PNG"]; < - これは自動解放です!

UIImageをプロパティとして設定しておくことができます。 このように:

@property (nonatomic,retain) UIImage *fris1; 

そしてそれらを.mで合成します。

self.fris1 = [UIImage imageNamed:@"fris01.PNG"]; 

このようにして、UIImageはアプリケーション全体で保持されます。

0

これはUIPickerView.hのものです。

/* これらのメソッドは、コンポーネントの行を表示するためにプレーンなUIStringまたはビュー(UILabelなど)を返します。ビューバージョンでは、隠されたビューや未使用のビューをキャッシュして再利用するために戻します。別のオブジェクトを戻すと、古いオブジェクトが解放されます。ビューはRECT行の中央する */

  • (NSStringの*)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)行forComponent:(NSInteger)成分; (NSInteger)コンポーネントの再利用ビュー:(UIView *)ビュー;(UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:

したがって、あなたのpickerviewが以前に表示されたuiimageviewを表示しようとすると、それは前のものを解放します。そのため、各コンポーネントごとに異なるuiimageviewを作成する必要があります。

2

私は同様の問題がありました。私は、オブジェクト、配列、画像を保持しようとしましたが、それはそれを修正しませんでした。あなたが-pickerView viewForRow:メソッドで配列をもう一度(viewDidLoadメソッドでどのように初期化したのか)考えてみたら、それはうまくいきました。すべてのメソッド呼び出しで同じ配列を再生成するのは効率的ではないようですが、そのトリックをやったようです。

関連する問題