2012-03-08 113 views
1

我有一个UITableViewController与图像名称列表。单击名称时,图像的URL将在ImageViewController中设置,然后UITableViewController继续变为ImageViewController,其中包含UIImageView(与插座连接)。在ImageViewControllerviewDidLoad中,我将UIImageView设置为来自URL的图像,但是当我在模拟器上运行它时,图像应该只出现黑屏。UIImageView不显示从UITableViewController设置图像

的SEGUE的一个小的视觉描述(其中 - >装置赛格瑞):

  • 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 

对发生了什么事有什么想法? 谢谢!

回答

3

不是真的要使用委托的正确途径。试试这个: 在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并在需要时调用performSegue的习惯。

+1

非常感谢ElJay,当我回家时我会试试这个。为了将来的参考,什么时候使用代表是适当的时间?我正在关注斯坦福大学的系列讲座,以及我能够告诉他们以这种方式使用的讲座。 – gg67 2012-03-09 02:58:37

+1

代表是一种很好的方法,可以告诉班级您已完成某项工作。它们可以用来让调用类知道某些事情已经完成,并且可以传回对象(例如,当您记录用户并需要传回UserInfo时)。他们没有真正使用(从我的经验)来呼吁某事。斯坦福的视频很棒。 – 2012-03-09 03:08:39

+1

谢谢。好吧,试过后,我仍然只是黑屏。此外,延续到图像需要更长的时间。思考? – gg67 2012-03-09 03:21:13

0

尝试调用此方法:

[self.imageView setImage:self.image]; 

-

(void)imageListTableViewController:(ImageListTableViewController *)sender 
          withURL:(NSURL *)imageURL; 
+0

没有运气。虽然谢谢! – gg67 2012-03-09 03:04:32

相关问题