UIImageView не отображает заданное изображение из UITableViewController - PullRequest
1 голос
/ 09 марта 2012

У меня есть UITableViewController со списком имен изображений.При щелчке имени URL-адрес изображения устанавливается в ImageViewController, а затем UITableViewController переходит к ImageViewController, который содержит UIImageView (связанный с розеткой).В ImageViewController viewDidLoad я установил UIImageView для изображения из URL, но когда я запускаю его на симуляторе, только черный экран появляется там, где должно быть изображение.

Небольшое визуальное описание перехода (где -> означает переход):

  • ImageListTableViewController -> ImageViewController (имеет UIImageView)

ImageListTableViewController.m

// The delegate here is the ImageViewController
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([segue.identifier isEqualToString:@"Show Image"]) {
        [self setDelegate:segue.destinationViewController];
    }
}
// getting URL and calling the protocol method (in ImageViewController) which sets
// the image as an @property
#pragma mark - Table view delegate

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSDictionary *imageDict = [self.imageArray objectAtIndex:indexPath.row];
    NSURL *imageURL = [FlickrFetcher urlForPhoto:imageDict format:FlickrPhotoFormatLarge];
    NSLog([imageURL description]);
    [self.delegate imageListTableViewController:self withURL:imageURL];
}

ImageViewController.m

#import "ImageViewController.h"

@implementation ImageViewController

@synthesize image = _image;
@synthesize imageView = _imageView;

- (void)imageListTableViewController:(ImageListTableViewController *)sender 
                             withURL:(NSURL *)imageURL;
{
    NSData *imageData = [NSData dataWithContentsOfURL:imageURL];
    self.image = [UIImage imageWithData:imageData];
}

#pragma mark - View lifecycle


// Implement loadView to create a view hierarchy programmatically, without using a nib.
- (void)loadView
{
  // nothing
}


// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad
{
    [super viewDidLoad];
    [self.imageView setImage:self.image];
}


- (void)viewDidUnload
{
    [self setImageView:nil];
    [super viewDidUnload];
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}

@end

Есть идеи о том, что происходит?Спасибо!

Ответы [ 2 ]

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

Не совсем правильный способ использования делегата.Попробуйте это: В ImageViewController.h:

@property(nonatomic,strong) NSURL *imageURL;

В ImageViewController.m

@synthesize imageURL;

Удалить imageListTableViewController

Изменить viewDidLoad:

- (void)viewDidLoad
{
    [super viewDidLoad];
    NSData *imageData = [NSData dataWithContentsOfURL:imageURL];
    self.image = [UIImage imageWithData:imageData];
}

Добавить в viewDidUnload:

[self setImageURL:nil];

Затем в вашем ImageListTableViewController.m: Изменить prepareForSegue:

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([segue.identifier isEqualToString:@"Show Image"]) {
        NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
        NSDictionary *imageDict = [self.imageArray objectAtIndex:indexPath.row];
        NSURL *imageURL = [FlickrFetcher urlForPhoto:imageDict format:FlickrPhotoFormatLarge];

        // Set the property on our Dest VC
        ImageViewController *ivc = segue.destinationViewController;
        ivc.imageURL = imageURL;

    }
}

Изменить didSelectRowAtIndexPath:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    [self performSegueWithIdentifier:@"Show Image" sender:nil];
}

Убедитесь, что вы подключили этот Segue к самому VC, а не к TableView.Если вы этого не сделаете, Segue будет уволен раньше, чем didSelectRowAtIndexPath.В этом случае это не будет иметь значения, но для реального контроля - приобретите привычку подключаться к VC и вызывать executeSegue при необходимости.

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

Попробуйте вызвать этот метод:

[self.imageView setImage:self.image];

в -

(void)imageListTableViewController:(ImageListTableViewController *)sender 
                             withURL:(NSURL *)imageURL;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...