-1

我在我的应用程序中制作 UICollectionView 时遇到了一些问题。我使用 IB 而不是故事板。这个问题的底部是我的 .h 和 .m 代码。在 IB 中,我添加了一个 UICollectionViewController 并告诉它我为它创建的 Obj-C 类的类。但是,当我运行它时,我得到的只是一个黑色视图。

。H:

#import <UIKit/UIKit.h>
@class WebViewController;
@class WebViewController2;
@interface GridLayout : UICollectionViewController <UICollectionViewDataSource, UICollectionViewDelegate> {
    NSOperationQueue *_queue;
    NSArray *_feeds;
    NSMutableArray *_allEntries;
    WebViewController *_webViewController;
    UIActivityIndicatorView *activity;
    WebViewController2 *_webViewController2;
    IBOutlet UIBarButtonItem *redo;
    IBOutlet UINavigationBar *myNavigationBar;
    NSString *theurl;
}
-(IBAction)sendtofriend;
-(IBAction)refreshing;
@property (nonatomic, retain) NSString *theurl;
@property (retain) NSOperationQueue *queue;
@property (retain) NSArray *feeds;
@property (retain) NSMutableArray *allEntries;
@property (retain) WebViewController *webViewController;
@property (retain) UIActivityIndicatorView *activity;
@property (retain) WebViewController2 *webViewController2;

@end

米:

#import "GridLayout.h"
#import "RSSEntry.h"
#import "ASIHTTPRequest.h"
#import "GDataXMLNode.h"
#import "Reachability.h"
#import "GDataXMLElement-Extras.h"
#import "NSDate+InternetDateTime.h"
#import "NSArray+Extras.h"
#import "WebViewController.h"
#import "SettingsViewController.h"
#import "WebViewController2.h"
#import "Cell.h"
#import "ASINetworkQueue.h"
#import "UIImageView+WebCache.h"

@implementation GridLayout

@synthesize allEntries = _allEntries;
@synthesize feeds = _feeds;
@synthesize queue = _queue;
@synthesize webViewController = _webViewController;
@synthesize activity;
@synthesize webViewController2 = _webViewController2;

- (void)refresh {
    self.allEntries = [NSMutableArray array];
    self.queue = [[[NSOperationQueue alloc] init] autorelease];
    self.feeds = [NSArray arrayWithObjects:@"http://feeds.feedburner.com/Ipreacherblog",
                  nil];
    for (NSString *feed in _feeds) {
        NSURL *url = [NSURL URLWithString:feed];
        ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
        [request setDelegate:self];
        [_queue addOperation:request];
    }

}

- (void)viewDidLoad {
    [super viewDidLoad];
    [activity startAnimating];
    self.title = @"iPreacher";

    UIBarButtonItem *sharing = [[UIBarButtonItem alloc] initWithTitle:@"Sharing Settings" style:UIBarButtonItemStylePlain target:self action:@selector(gotosettings)];
    self.navigationItem.rightBarButtonItem = sharing;

       //
    // Create a header view. Wrap it in a container to allow us to position
    // it better.
    //

    [self refresh];
}
-(void)gotosettings {
    SettingsViewController *dvController = [[SettingsViewController alloc] initWithNibName:@"SettingsViewController" bundle:[NSBundle mainBundle]];

    [self.navigationController pushViewController:dvController animated:YES];
}
-(void) refreshInvoked:(id)sender forState:(UIControlState)state {
    // Refresh table here...
    [_allEntries removeAllObjects];
    [self refresh];
}

- (void)parseRss:(GDataXMLElement *)rootElement entries:(NSMutableArray *)entries {

    NSArray *channels = [rootElement elementsForName:@"channel"];
    for (GDataXMLElement *channel in channels) {

        NSString *blogTitle = [channel valueForChild:@"title"];

        NSArray *items = [channel elementsForName:@"item"];
        for (GDataXMLElement *item in items) {

            NSString *articleTitle = [item valueForChild:@"title"];
            NSString *articleUrl = [item valueForChild:@"link"];
            NSString *articleDateString = [item valueForChild:@"pubDate"];
            NSDate *articleDate = [NSDate dateFromInternetDateTimeString:articleDateString formatHint:DateFormatHintRFC822];
            NSString *articleImage = [item valueForChild:@"content:encoded"];
            NSScanner *theScanner;
            NSString *gt =nil;
            theScanner = [NSScanner scannerWithString:articleImage];



            // find start of tag
            [theScanner scanUpToString:@"alt=\"\" width=" intoString:NULL] ;

            // find end of tag
            [theScanner scanUpToString:@"/>" intoString:&gt] ;
            // replace the found tag with a space
            //(you can filter multi-spaces out later if you wish)
            NSString *test = [articleImage stringByReplacingOccurrencesOfString:[ NSString stringWithFormat:@"%@", gt] withString:@"alt=\"\" width=\"device-width\" height=\"150\""];
            NSString *comments = [articleUrl stringByAppendingString:@"#respond"];
            NSString *commentslink = [NSString stringWithFormat: @"<a href=\"%@\">Leave A Comment</a>",comments];

            NSString *final = [test stringByReplacingOccurrencesOfString:@"float:none;height:30px" withString:@"float:none;height:1px"];
            NSDateFormatter * dateFormatter = [[[NSDateFormatter alloc] init] autorelease];
            [dateFormatter setTimeStyle:NSDateFormatterShortStyle];
            [dateFormatter setDateStyle:NSDateFormatterMediumStyle];
            NSString *dateofarticle = [dateFormatter stringFromDate:articleDate];

            NSString *bodyoftext = [[[[[[@"<head><style type='text/css'>a > img {pointer-events: none;cursor: default;}</style></head><b><font size=5><div align=\"left\">" stringByAppendingString:articleTitle] stringByAppendingString:@"</font></b><font size=3><p style=\"color:#989898\">"] stringByAppendingString:dateofarticle] stringByAppendingString:@"</div></p>"] stringByAppendingString:final] stringByAppendingString:commentslink];









            RSSEntry *entry = [[[RSSEntry alloc] initWithBlogTitle:blogTitle
                                                      articleTitle:articleTitle
                                                        articleUrl:articleUrl
                                                       articleDate:articleDate
                                                      articleImage:bodyoftext] autorelease];
            [entries addObject:entry];

        }
    }

}

- (void)parseAtom:(GDataXMLElement *)rootElement entries:(NSMutableArray *)entries {

    NSString *blogTitle = [rootElement valueForChild:@"title"];

    NSArray *items = [rootElement elementsForName:@"entry"];
    for (GDataXMLElement *item in items) {

        NSString *articleTitle = [item valueForChild:@"title"];
        NSString *articleUrl = [item valueForChild:@"link"];
        NSString *articleDateString = [item valueForChild:@"pubDate"];
        NSDate *articleDate = [NSDate dateFromInternetDateTimeString:articleDateString formatHint:DateFormatHintRFC822];
        NSString *articleImage = [item valueForChild:@"content:encoded"];


        NSDateFormatter * dateFormatter = [[[NSDateFormatter alloc] init] autorelease];
        [dateFormatter setTimeStyle:NSDateFormatterShortStyle];
        [dateFormatter setDateStyle:NSDateFormatterMediumStyle];
        NSString *dateofarticle = [dateFormatter stringFromDate:articleDate];
        NSString *bodyoftext = [[[[[@"<b><font size=5><div align=\"left\">" stringByAppendingString:articleTitle] stringByAppendingString:@"</font></b><font size=3><p style=\"color:#989898\">"] stringByAppendingString:dateofarticle] stringByAppendingString:@"</div></p>"] stringByAppendingString:articleImage];












        RSSEntry *entry = [[[RSSEntry alloc] initWithBlogTitle:blogTitle
                                                  articleTitle:articleTitle
                                                    articleUrl:articleUrl
                                                   articleDate:articleDate
                                                  articleImage:bodyoftext] autorelease];
        [entries addObject:entry];


    }

}

- (void)parseFeed:(GDataXMLElement *)rootElement entries:(NSMutableArray *)entries {

    if ([rootElement.name compare:@"rss"] == NSOrderedSame) {
        [self parseRss:rootElement entries:entries];
    } else if ([rootElement.name compare:@"feed"] == NSOrderedSame) {
        [self parseAtom:rootElement entries:entries];
    } else {
        NSLog(@"Unsupported root element: %@", rootElement.name);
    }
}

- (void)requestFinished:(ASIHTTPRequest *)request {

    [_queue addOperationWithBlock:^{

        NSError *error;
        GDataXMLDocument *doc = [[GDataXMLDocument alloc] initWithData:[request responseData]
                                                               options:0 error:&error];
        if (doc == nil) {
            NSLog(@"Failed to parse %@", request.url);
        } else {

            NSMutableArray *entries = [NSMutableArray array];
            [self parseFeed:doc.rootElement entries:entries];

            [[NSOperationQueue mainQueue] addOperationWithBlock:^{

                for (RSSEntry *entry in entries) {

                    int insertIdx = [_allEntries indexForInsertingObject:entry sortedUsingBlock:^(id a, id b) {
                        RSSEntry *entry1 = (RSSEntry *) a;
                        RSSEntry *entry2 = (RSSEntry *) b;
                        return [entry1.articleDate compare:entry2.articleDate];
                    }];

                    [_allEntries insertObject:entry atIndex:insertIdx];
                                  }

            }];

        }
    }];

}

- (void)requestFailed:(ASIHTTPRequest *)request {
    NSError *error = [request error];
    NSLog(@"Error: %@", error);
    [self refresh];
}
-(NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView {
    return 1;
}
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section{
    return [_allEntries count];
}


- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{
    static NSString *identifier = @"Cell";

    UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:identifier forIndexPath:indexPath];

    RSSEntry *entry = [_allEntries objectAtIndex:indexPath.row];
    NSString *substring = @"http://316apps.com/ipreachersblog/wp";
    NSRange textRange = [entry.articleImage rangeOfString:substring];
    UIImageView *recipeImageView = (UIImageView *)[cell viewWithTag:100];

    if(textRange.location != NSNotFound){
        NSString *thearticleImage = entry.articleImage;
        NSRegularExpression *expression = [NSRegularExpression regularExpressionWithPattern:@"src=\"([^\"]+)\"" options:NSRegularExpressionCaseInsensitive error:NULL];
        NSString *someString = thearticleImage;
        NSString *oneurl = [someString substringWithRange:[expression rangeOfFirstMatchInString:someString options:NSMatchingCompleted range:NSMakeRange(0, [someString length])]];
        NSString *finalstring = [oneurl stringByReplacingOccurrencesOfString:@"src=\"" withString:@""];
        NSString *thefinalstring = [finalstring stringByReplacingOccurrencesOfString:@"\"" withString:@""];
        NSDateFormatter * dateFormatter = [[[NSDateFormatter alloc] init] autorelease];
        [dateFormatter setTimeZone:[NSTimeZone localTimeZone]];
        [dateFormatter setTimeStyle:NSDateFormatterShortStyle];
        [dateFormatter setDateStyle:NSDateFormatterShortStyle];
        recipeImageView.image = [UIImage imageNamed:thefinalstring];
        recipeImageView.backgroundColor = [UIColor clearColor];

    }
    else    {

        NSDateFormatter * dateFormatter = [[[NSDateFormatter alloc] init] autorelease];
        [dateFormatter setTimeZone:[NSTimeZone localTimeZone]];
        [dateFormatter setTimeStyle:NSDateFormatterShortStyle];
        [dateFormatter setDateStyle:NSDateFormatterShortStyle];
        recipeImageView.image = [UIImage imageNamed:@"icon@2x.png"];
        recipeImageView.backgroundColor = [UIColor clearColor];

    }




   cell.backgroundView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"photo-frame.png"]];

    return cell;
}


@end

更新:我在这里上传了我的整个项目。

4

1 回答 1

0

在您的 GridViewClass 中,您需要在 requestFinished 方法中对集合视图调用 reloadData:

- (void)requestFinished:(ASIHTTPRequest *)request {

    [_queue addOperationWithBlock:^{

        NSError *error;
        GDataXMLDocument *doc = [[GDataXMLDocument alloc] initWithData:[request responseData]
                                                               options:0 error:&error];
        if (doc == nil) {
            NSLog(@"Failed to parse %@", request.url);
        } else {

            NSMutableArray *entries = [NSMutableArray array];
            [self parseFeed:doc.rootElement entries:entries];

            [[NSOperationQueue mainQueue] addOperationWithBlock:^{

                for (RSSEntry *entry in entries) {
                    int insertIdx = [_allEntries indexForInsertingObject:entry sortedUsingBlock:^(id a, id b) {
                        RSSEntry *entry1 = (RSSEntry *) a;
                        RSSEntry *entry2 = (RSSEntry *) b;
                        return [entry1.articleDate compare:entry2.articleDate];
                    }];
                    [_allEntries insertObject:entry atIndex:insertIdx];

                }
                [self.collectionView reloadData]; // <== This was missing
            }];
        }
    }];
}
于 2013-05-15T04:00:28.147 回答