проблема с UiImageView.image = nil - PullRequest
0 голосов
/ 22 июня 2011

.h файл

  @interface AppViewController : UIViewController {
  ...
  UIImageView *imageViewArray[3][5];// not using any @property for this
  ...

 }
  ...
 #define FOR(j,q) for (int j = 0; j < q; j++)

.m файл

  ViewDidLoad{
     FOR(i,5){
    FOR(j,3) 
    {
        image_names[0] = [UIImage imageNamed:[NSString stringWithFormat:@"%d.png",j]];
        imageViewArray[j][i] = [[UIImageView alloc] initWithImage: image_names[0]];
        CGRect newFrame ; 
        newFrame = CGRectMake(60+(j*130), 110+(150*i),130,136); 
        imageViewArray[j][i].frame = newFrame;
        [self.view addSubview:imageViewArray[j][i]];
      }
    }                   
}

 //clear the previous images and call a method to add new
 -(IBAction)Change{
      FOR(i,5)
        FOR(p,3) 
           imageViewArray[p][i].image = nil;

      [self ImageSwitch];
}


 -(void)ImageSwitch{

           FOR(i,5){
        FOR(j,3) 
        {   
           image_namesTmp[0] = [UIImage imageNamed:[NSString stringWithFormat:@"%d.png",j+3]];
           imageViewArray[j][i] = [[UIImageView alloc] initWithImage: image_namesTmp[0]];
           CGRect newFrame ; 
                 newFrame = CGRectMake(60+(j*130), 110+(150*i),130,136); 
              imageViewArray[j][i].frame = newFrame;
          [self.view addSubview:imageViewArray[j][i]];
                    }
               }
           }

, когда я нажимаю кнопку в первый раз, она работаетхорошо (старые изображения заменяются новыми), но если я сделаю это второй раз

        imageViewArray[p][i].image = nil;

, эта строка не будет работать, и все предыдущие изображения все еще остаются там, а новые изображения перекрываются с существующими

Ответы [ 3 ]

1 голос
/ 22 июня 2011

Во второй раз, когда вы устанавливаете свои изображения, вам не нужно воссоздавать UIImageView объекты.Ваш ImageSwitch метод лучше объявить как

-(void)ImageSwitch{

    FOR(i,5){
        FOR(j,3) 
        {   
            imageViewArray[j][i].image = [UIImage imageNamed:[NSString stringWithFormat:@"%d.png",j+3]];
        }
    }
}

Достаточно просто изменить изображения, и это то, что вам нужно сделать.

1 голос
/ 22 июня 2011

В методе ImageSwitch вы всегда создаете новые экземпляры UIImageView.

imageViewArray[j][i] = [[UIImageView alloc] initWithImage: image_namesTmp[0]];

На данный момент уже есть ссылка на UIImageView, сохраненная в переменной.Вы теряете свою ссылку на него и, поскольку вы выделяете / инициируете его, вы, скорее всего, также потеряете его память.Более того, вы добавляете новые UIImageViews в иерархию представлений, но не удаляете старые.

Попробуйте что-то вроде этого:

[imageViewArray[j][i] removeFromSuperview];
[imageViewArray[j][i] release];
imageViewArray[j][i] = [[UIImageView alloc] initWithImage: image_namesTmp[0]];
0 голосов
/ 22 июня 2011

Вам нужен NSMutableArray из ImageViews. В вашем заголовке объявите NSMutableArray:

NSMutableArray *_imageViewArray;

Затем в вашем методе viewDidLoad инициализируйте массив, а затем заполните его представлениями вашего изображения.

_imageViewArray = [[NSMutableArray alloc]init];
for (int i =0; i < imageNames; i++) {
   UIImageView *tempImageView = [[UIImageView alloc]initWithImage:[UIImage imageNamed:[imageNames objectAtIndex:i];
   [_imageViewArray addObject:tempImageView];
   [tempImageView release];
 }

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

[self.view removeAllSubviews]; // gets rid of all previous subviews.
[self.view addSubview:[_imageViewArray objectAtIndex:3]];// could be any number. generate a random number if you want.

Это все, что вам нужно сделать. Если вы хотите узнать, какое представление изображения было отображено, возможно, объявите экземпляр UIImageView в вашем заголовке с именем _currentImageView, а затем вы можете удалить только это представление изображения вместо всех подпредставлений. Надеюсь, это помогло.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...