2011-12-27 24 views
0

我正在构建一个应用程序,用户可以旋转一个UIPickerView像老虎机一样。在运行时,我的pickerView中的图像随机消失,这是我面临的问题。然后再旋转,其中一些又回来了。从我的UIPickerView图像消失

这里是我使用,使图像阵列的代码(在我的项目有17个图像的每个阵列中,但节省一点的空间,我把范围缩小):

- (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]; 

} 

这是代码,其中我加载图像在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。 – 2011-12-27 16:05:44

+0

感谢您的回复,但我的所有图片都在2到5 KB之间,所以我无法想象那是什么问题。 – 2011-12-28 09:40:25

回答

0

认为这个问题在您初始化UIImages规定:

UIImage *fris1 = [UIImage imageNamed:@"fris01.PNG"]; < - 这是自动释放!

您需要将您的UIImages设置为属性,以便可以保留它们。 像这样:

@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的)组分; (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)组件reusingView:(UIView *)view;

因此,当您的pickerview尝试显示先前显示的uiimageview时,它会释放前一个。这就是为什么你应该为每个组件创建不同的uiimageview。

2

我有类似的问题。我试图保留对象,数组,图像,但没有解决它。事实证明,如果我在-pickerView viewForRow:方法中再次填充数组(ala如何在viewDidLoad方法中初始化它们),那么它工作得很好。似乎没有效率重新填充每个方法调用相同的数组,但它似乎有伎俩。