【问题标题】:ios lazytableimages in Storyboard故事板中的 ioslazytableimages
【发布时间】:2012-09-15 04:15:31
【问题描述】:

如何将 iphone lazytableimages 从 .xib 文件转换为使用情节提要?或任何使用情节提要的示例代码,类似于lazytableimages。源代码来自https://developer.apple.com/library/ios/#samplecode/LazyTableImages/Introduction/Intro.html

【问题讨论】:

    标签: ios


    【解决方案1】:

    控制器的视图来自哪里并不重要,无论是 xib、代码还是故事板。在该示例中,控制器的代码没有改变,只需确保将场景放在情节提要上,设置它的视图控制器类并连接所有插座。

    【讨论】:

    • 感谢您的回复。我已成功转移到情节提要。但是图像不会从屏幕上显示以进行初始加载,直到我向下滚动并再次向上滚动然后只显示图像。如果向下滚动以加载新记录,它可以显示图像。有什么办法解决这个问题吗?
    • 听起来您在某处缺少 reloadData 或 reloadRowsAt...。发布您的视图控制器代码。
    【解决方案2】:
    #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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-30
      • 2012-05-06
      • 2011-12-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多