Изображения из моего UIPickerView исчезают - PullRequest
0 голосов
/ 27 декабря 2011

Я создаю приложение, в котором пользователь может вращать UIPickerView, как игровой автомат.Проблема, с которой я сталкиваюсь в тот момент, когда во время выполнения изображения в моем pickerView начинают исчезать в случайном порядке.Тогда вращайтесь снова, и некоторые из них вернулись.

Вот код, который я использую для создания массива изображений (в моем проекте 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];

    }    
}

Надеюсь, этого достаточно, и янадеюсь, кто-нибудь может мне помочь.

Ответы [ 3 ]

2 голосов
/ 14 ноября 2012

У меня была похожая проблема.Я пытался сохранить объекты, массивы, изображения, но это не помогло.Оказывается, что если я снова заполнил массивы (аля, как вы инициализировали их в методе viewDidLoad) в -pickerView viewForRow: метод, то он работал отлично.Кажется неэффективным заполнять одни и те же массивы при каждом вызове метода, но, похоже, это сработало.

0 голосов
/ 14 сентября 2012

Это из UIPickerView.h.

/ * эти методы возвращают либо простую UIString, либо представление (например, UILabel), чтобы отобразить строку для компонента. для версий представлений мы кэшируем любые скрытые и, следовательно, неиспользуемые представления и возвращаем их для повторного использования. Если вы вернете другой объект, старый будет освобожден. вид будет центрирован в строке прямоугольника * /

  • (NSString *) pickerView: (UIPickerView *) pickerView titleForRow: (NSInteger) строка для компонента: (NSInteger);
  • (UIView *) pickerView: (UIPickerView *) pickerView viewForRow: (NSInteger) строка forComponent: (NSInteger) компонент reusingView: (UIView *) представление;

Таким образом, когда ваше окно выбора пытается показать ранее показанное изображение uiimage, оно освобождает предыдущее. Вот почему вы должны создать разные uiimageview для каждого компонента.

0 голосов
/ 09 марта 2012

I думаю проблема заключается в том, где вы инициализируете ваши UIImages:

UIImage *fris1 = [UIImage imageNamed:@"fris01.PNG"]; <- это авто-релиз! </p>

Вам необходимо установить ваши UIImages как свойства, чтобы их можно было сохранить. Вот так:

@property (nonatomic,retain) UIImage *fris1;

и синтезируйте их в своем .m. и применяя изображение как:

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

Таким образом, UIImage сохраняется на протяжении всей жизни приложения.

...