2012-09-15 113 views

回答

0

无论控制器的视图来自何处,无论是xib,代码还是故事板。在这个例子中,控制器的代码不会改变,只要确保将情景放在故事板上,将其设置为视图控制器类并连接所有插座。

+0

感谢您的回复。我已成功转移到故事板。但图像不显示从初始负载的屏幕,直到我向下滚动并再次向上滚动,然后只显示图像。如果向下滚动以加载新记录,它可以显示图像。任何想法解决这个问题? –

+0

听起来像缺少reloadData或reloadRowsAt ...在某处。发布您的视图控制器代码。 –

0
#import "MasterListViewController.h" 
#import "AppRecord.h" 
#import "RootViewController.h" 
#import "ParseOperation.h" 

#define kCustomRowHeight 60.0 
#define kCustomRowCount  7 

static NSString *const TopPaidAppsFeed = 
@"http://phobos.apple.com/WebObjects/MZStoreServices.woa/ws/RSS/toppaidapplications/limit=75/xml"; 

@interface MasterListViewController() 
- (void)startIconDownload:(AppRecord *)appRecord forIndexPath:(NSIndexPath *)indexPath; 
@end 

@implementation MasterListViewController 

@synthesize entries; 
@synthesize imageDownloadsInProgress; 

- (id)initWithStyle:(UITableViewStyle)style 
{ 
    self = [super initWithStyle:style]; 
    if (self) { 
     // Custom initialization 
    } 
    return self; 
} 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    self.imageDownloadsInProgress = [NSMutableDictionary dictionary]; 
    self.tableView.rowHeight = kCustomRowHeight; 
} 

- (void)viewDidUnload 
{ 
    [super viewDidUnload]; 
} 

- (void)didReceiveMemoryWarning 
{ 
    [super didReceiveMemoryWarning]; 

    NSArray *allDownloads = [self.imageDownloadsInProgress allValues]; 
    [allDownloads makeObjectsPerformSelector:@selector(cancelDownload)]; 
} 

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{ 
    return (interfaceOrientation == UIInterfaceOrientationPortrait); 
} 

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
{ 
    return 1; 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    int count = [entries count]; 

    if (count == 0) 
    { 
     return kCustomRowCount; 
    } 
    return count; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    // customize the appearance of table view cells 
    // 
    static NSString *CellIdentifier = @"LazyTableCell"; 
    static NSString *PlaceholderCellIdentifier = @"PlaceholderCell"; 

    // add a placeholder cell while waiting on table data 
    int nodeCount = [self.entries count]; 

    //NSLog(@"RootViewController - nodeCount is %d",nodeCount); 

    if (nodeCount == 0 && indexPath.row == 0) 
    { 
     UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:PlaceholderCellIdentifier]; 
     if (cell == nil) 
     { 
      cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle 
              reuseIdentifier:PlaceholderCellIdentifier]; 
      cell.detailTextLabel.textAlignment = UITextAlignmentCenter; 
      cell.selectionStyle = UITableViewCellSelectionStyleNone; 
     } 

     cell.detailTextLabel.text = @"Loading…"; 

     return cell; 
    } 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) 
    { 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle 
             reuseIdentifier:CellIdentifier]; 
     cell.selectionStyle = UITableViewCellSelectionStyleNone; 
    } 

    // Leave cells empty if there's no data yet 
    if (nodeCount > 0) 
    { 
     // Set up the cell... 
     AppRecord *appRecord = [self.entries objectAtIndex:indexPath.row]; 

     cell.textLabel.text = appRecord.appName; 
     cell.detailTextLabel.text = appRecord.artist; 

     // Only load cached images; defer new downloads until scrolling ends 
     if (!appRecord.appIcon) 
     { 
      if (self.tableView.dragging == NO && self.tableView.decelerating == NO) 
      { 
       [self startIconDownload:appRecord forIndexPath:indexPath]; 
      } 
      // if a download is deferred or in progress, return a placeholder image 
      cell.imageView.image = [UIImage imageNamed:@"Placeholder.png"]; 
     } 
     else 
     { 
      cell.imageView.image = appRecord.appIcon; 
     } 

    } 

    return cell; 
} 


- (void)startIconDownload:(AppRecord *)appRecord forIndexPath:(NSIndexPath *)indexPath 
{ 
    IconDownloader *iconDownloader = [imageDownloadsInProgress objectForKey:indexPath]; 
    if (iconDownloader == nil) 
    { 
     iconDownloader = [[IconDownloader alloc] init]; 
     iconDownloader.appRecord = appRecord; 
     iconDownloader.indexPathInTableView = indexPath; 
     iconDownloader.delegate = self; 
     [imageDownloadsInProgress setObject:iconDownloader forKey:indexPath]; 
     [iconDownloader startDownload]; 
    } 
} 

- (void)loadImagesForOnscreenRows 
{ 
    if ([self.entries count] > 0) 
    { 
     NSArray *visiblePaths = [self.tableView indexPathsForVisibleRows]; 
     for (NSIndexPath *indexPath in visiblePaths) 
     { 
      AppRecord *appRecord = [self.entries objectAtIndex:indexPath.row]; 

      if (!appRecord.appIcon) // avoid the app icon download if the app already has an icon 
      { 
       [self startIconDownload:appRecord forIndexPath:indexPath]; 
      } 
     } 
    } 
} 

// called by our ImageDownloader when an icon is ready to be displayed 
- (void)appImageDidLoad:(NSIndexPath *)indexPath 
{ 
    IconDownloader *iconDownloader = [imageDownloadsInProgress objectForKey:indexPath]; 
    if (iconDownloader != nil) 
    { 
     UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:iconDownloader.indexPathInTableView]; 

     // Display the newly loaded image 
     cell.imageView.image = iconDownloader.appRecord.appIcon; 
    } 

    // Remove the IconDownloader from the in progress list. 
    // This will result in it being deallocated. 
    [imageDownloadsInProgress removeObjectForKey:indexPath]; 
} 


// Load images for all onscreen rows when scrolling is finished 
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate 
{ 
    if (!decelerate) 
    { 
     [self loadImagesForOnscreenRows]; 
    } 
} 

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView 
{ 
    [self loadImagesForOnscreenRows]; 
} 

@end