Как обновить представление в target-c - PullRequest
1 голос
/ 16 декабря 2011

Я хотел создать галерею. Он загружает разные изображения в зависимости от категории, которую выбирает пользователь. Я использовал для заполнения изображений в UIImageViews.

Мое при выборе различных категорий заключается в том, что он не очищает ранее выбранные изображения. Это мой код для заполнения изображений.

-(void)refresh{

   categoryLabel.text = treatment.treatmentName;
   NSMutableArray  *galleryImages =[NSMutableArray alloc] ;
   galleryImages = [[PatientImage alloc]find:treatment.treatmentId];

   int imgCount = [galleryImages count];

    for(int i=0;i<imgCount;i++){

        PatientImage *apatientImage = [galleryImages objectAtIndex:i]; 

        UIImage *img1 = [UIImage imageNamed:apatientImage.imageBefore]; 
        UIImageView *myImageView = [[UIImageView alloc] initWithImage:img1];
        myImageView.contentMode = UIViewContentModeTopRight;
        myImageView.frame = CGRectMake(120+i*240,120.0,100.0, 100.0);
       [self.view addSubview:myImageView];

        UIImage *img2 = [UIImage imageNamed:apatientImage.imageAfter]; 
        UIImageView *myImageView2 = [[UIImageView alloc] initWithImage:img2];
        myImageView2.contentMode = UIViewContentModeTopRight;
        myImageView2.frame = CGRectMake(120+i*240+300,120.0,100.0, 100.0);
        [self.view addSubview:myImageView2];
    }
}  

Ответы [ 3 ]

3 голосов
/ 16 декабря 2011

Перво-наперво, у вас есть утечки памяти.Вы размещаете UIImageViews, но нигде не выпускаете их после того, как добавили их в свое представление.Я не знаю, относится ли это к ARC, хотя.То же самое относится и к вашему массиву Mutable, но я предполагаю, что вы выпускаете его после цикла 'for' где-то, так как кажется, что вы разместили код после пропуска части из него.

Что касается вашего фактического вопроса, яне будет делать это таким образом.Я бы сделал изменяемый массив объектной переменной, а затем заполнил его своими представлениями изображений.При повторном вызове refresh я сначала вызываю -removeFromSuperview для каждого представления изображения, затем очищаю массив, затем снова заполняю его и добавляю новые подпредставления в мое представление.Это простой способ.

Я не знаю, используете ли вы ARC, но вы должны быть осторожны с управлением памятью при использовании динамически загружаемых представлений.Каждый раз, когда вы добавляете представление к другому, вы увеличиваете счетчик сохранений.Затем необходимо вызвать release, чтобы удалить владельца, и позволить среде выполнения iOS обрабатывать все остальное.

Также обратите внимание, что такие операции, как это с использованием представлений, являются дорогостоящими с точки зрения памяти.Итак, еще один способ заново заполнить представление галереи - просто изменить изображение, которое содержит imageView.Это сэкономит вам память и время.Если в представлении нет постоянного числа изображений для отображения, вы можете уточнить свой алгоритм, чтобы изменить изображения в уже созданных представлениях изображений, а затем добавить дополнительные представления изображений, если это необходимо, или удалить оставшиеся, если таковые имеются.

Надеюсь, я помог.

2 голосов
/ 16 декабря 2011

попробуйте в начале вызова обновления

    [[self subviews] makeObjectsPerformSelector: @selector(removeFromSuperview)];

или

    for (id imageView in self.subviews){
            if([imageView isKindOfClass:[UIImageView class]]) [imageView removeFromSuperview];
    }
1 голос
/ 16 декабря 2011
call [tableview reloadData] if You are using tableview to show your gallery images 
or call view's 
[self.view setNeedsDisplay] method for refreshing the view.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...