Yadnesh
Yadnesh

Reputation: 1327

problem with UiImageView.image = nil

.h file

  @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 file

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

when i press the button for the first time it works fine(old images get replaced with new ones),but if i do it second time

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

this line wont work and all the previous images still remain there and new images are overlapping with the present ones

Upvotes: 0

Views: 2175

Answers (3)

Deepak Danduprolu
Deepak Danduprolu

Reputation: 44633

Second time you set your images you don't need to recreate the UIImageView objects. Your ImageSwitch method is better declared as,

-(void)ImageSwitch{

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

Just changing the images will suffice and that's what you need to do.

Upvotes: 1

Jiri
Jiri

Reputation: 2206

In the ImageSwitch method you are always creating new instances of UIImageView.

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

At this point, there already is a reference to UIImageView stored in the variable. You are losing your reference to it and since you alloc/inited it, you will most probably also leak its memory. Moreover, you are adding new UIImageViews to the view hierarchy, but you are not removing the old ones.

Try something like this:

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

Upvotes: 1

StuStirling
StuStirling

Reputation: 16181

You need an NSMutableArray of ImageViews. In your header declare the NSMutableArray:

NSMutableArray *_imageViewArray;

Then in your viewDidLoad method initialize the array and then populate it with your image views.

_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];
 }

So thats the image view array populated, you may do it a different way but thats up to you. To switch the views over what I would do is like so...

[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.

Thats all you would need to do. If you wanted to know which image view was being displauyed the maybe declare an instance of UIImageView in your header called _currentImageView and then you can remove just that image view instead of all subviews.
Hope this helped.

Upvotes: 0

Related Questions