Не могу установить изображение для UIImageView - PullRequest
1 голос
/ 03 февраля 2012

У меня есть UIImageView, и я не могу получить изображение и настроить его на показ.

в viewDidLoad

albumContainer = [[UIImageView alloc]initWithFrame:CGRectMake(112, 7, 97, 97)];
[self.view addSubview:albumContainer];

Метод вызывается из другого класса

NSLog(@"URL:%@",url);
//URL is defined by different class
//URL is http://www.....882546328.jpg (I abbreviated it, but it is a valid url)
NSData *imageData = [NSData dataWithContentsOfURL:url];
NSLog(@"URL LENGTH:%d",[imageData length]);
// URL LENGTH:90158

UIImage *tempImage = [UIImage imageWithData:imageData];
[albumContainer setImage:tempImage];

ПОЛНЫЙ КОД

PlayerViewController

-(void)viewDidLoad{
    [super viewDidLoad];
    playerView = [[AlbumViewController alloc]initWithNibName:@"AlbumViewController" bundle:nil];
}
-(void)playMusic{

    playerView.url = [NSURL URLWithString:imagePathForm];
    playerView.songData = receivedData;
    [loadingSong stopAnimating];
    [playerView play]; 

}

AlbumViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    albumContainer = [[UIImageView alloc]initWithFrame:CGRectMake(112, 7, 97, 97)];
    [self.view addSubview:albumContainer];
    url = [NSURL URLWithString:@""];
}

-(void)play{
    NSLog(@"SONGDATA:%d",[songData length]);
    player = [[AVAudioPlayer alloc] initWithData:songData error: nil];
    [player stop];

    player.delegate = self;
    player.numberOfLoops = 0;
    player.volume = 0.5; 
    [player prepareToPlay];
    [player play];
    NSLog(@"URL:%@",url);
    NSData *imageData = [NSData dataWithContentsOfURL:url];
    NSLog(@"URL LENGTH:%d",[imageData length]);

    UIImage *tempImage = [UIImage imageWithData:imageData];

    [albumContainer setImage:tempImage];

}

Я проверил и albumContainer вошел как NULL

1 Ответ

1 голос
/ 03 февраля 2012

Вы проверили, что представление контроллера было загружено, прежде чем установить изображение?Контроллеры UIViewControllers не загружают свое представление, пока оно не отображается, и иногда выгружают его, когда оно находится за пределами экрана, поэтому viewDidLoad, возможно, не был вызван в тот момент, когда вы вызываете ваш

[albumContainer setImage:tempImage];

извне контроллера.Попробуйте зарегистрировать albumContainer, чтобы увидеть, равен ли он нулю, прежде чем устанавливать изображение, например:

NSLog(@"albumContainer: %@", albumContainer); //might log as null
[albumContainer setImage:tempImage];

Чтобы принудительно загрузить представление контроллера, вы можете сказать:

[controller view]; // this will load the view and call viewDidLoad
[albumContainer setImage:tempImage];

Но вы можетеЛучше всего создать альбом albumContainer в initWithNibName: bundle: метод вашего контроллера представления, а не в viewDidLoad, например:

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)bundleOrNil
{
    if ((self = [super initWithNibName:nibNameOrNil bundle:bundleOrNil]))
    {
         albumContainer = [[UIImageView alloc]initWithFrame:CGRectMake(112, 7, 97, 97)];
[self.view addSubview:albumContainer];
    }
    return self;
}

Таким образом, он будет создан одновременно с контроллером, даже еслипредставление еще не загружено.

...