2015-05-08 5 views
-1

Я пытаюсь реализовать функцию pull-to-refresh в моей таблице RSS-лент. Список обычно загружается при загрузке приложения, но мне по существу нужно реплицировать его для выпадающего списка.Objective-C Pull to Refresh

Может ли кто-нибудь помочь, почему код не работает?

#import "RSSTableViewController.h" 
#import "RSSDetailViewController.h" 

@interface RSSTableViewController() { 


    NSXMLParser *parser; 
    NSMutableArray *feeds; 
    NSMutableDictionary *item; 
    NSMutableString *title; 
    NSMutableString *link; 
    NSString *element; 

} 

@end 

@implementation RSSTableViewController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    // RSS Settings 
    feeds = [[NSMutableArray alloc] init]; 
    NSURL *url = [NSURL URLWithString:@"http://external.example.co.uk/newpost/example.rss"]; 
    parser = [[NSXMLParser alloc] initWithContentsOfURL:url]; 
    [parser setDelegate:self]; 
    [parser setShouldResolveExternalEntities:NO]; 
    [parser parse]; 


    UIRefreshControl *refresh = [[UIRefreshControl alloc] init]; 
    refresh.attributedTitle = [[NSAttributedString alloc] initWithString:@"Pull to Refresh"]; 
    [refresh addTarget:self 
       action:@selector(refreshView:) 
       forControlEvents:UIControlEventValueChanged]; 
    self.refreshControl = refresh; 


} 


- (void)refreshView:(UIRefreshControl *)refresh { 
     refresh.attributedTitle = [[NSAttributedString alloc] initWithString:@"Refreshing news feed..."]; 

     // Refresh Logic 
    NSURL *url = [NSURL URLWithString:@"http://external.example.co.uk/newpost/example.rss"]; 
    parser = [[NSXMLParser alloc] initWithContentsOfURL:url]; 
    [parser setDelegate:self]; 
    [parser setShouldResolveExternalEntities:NO]; 
    [parser parse]; 


     // Set the timestamp 
     NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; 
     [formatter setDateFormat:@"MMM d, h:mm a"]; 
     NSString *lastUpdated = [NSString stringWithFormat:@"Last updated: %@", 
            [formatter stringFromDate:[NSDate date]]]; 
     refresh.attributedTitle = [[NSAttributedString alloc] initWithString:lastUpdated]; 
     [refresh endRefreshing]; 
     [self.tableView reloadData]; 
} 



- (void)parserDidEndDocument:(NSXMLParser *)parser { 
    [refreshView endRefreshing]; //'Use of undeclared identifier 'refresh view'// 
    [self.tableView reloadData]; 
} 


- (void)didReceiveMemoryWarning { 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 

#pragma mark - Table view data source 

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 
    // Return the number of sections. 
    return 1; 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
    // Return the number of rows in the section. 
    return feeds.count; 
} 


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath]; 
    cell.textLabel.text = [[feeds objectAtIndex:indexPath.row] objectForKey:@"title"]; 

    return cell; 
} 



- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict { 

    element = elementName; 

    if ([element isEqualToString:@"item"]) { 
     item = [[NSMutableDictionary alloc]init]; 
     title = [[NSMutableString alloc]init]; 
     link = [[NSMutableString alloc]init]; 
    } 
} 



- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName { 

    if ([elementName isEqualToString:@"item"]) { 
     [item setObject:title forKey:@"title"]; 
     [item setObject:link forKey:@"link"]; 
     [feeds addObject:[item copy]]; 
    } 
} 



- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { 

    if ([element isEqualToString:@"title"]) { 
     [title appendString:string]; 
    } 
    else if ([element isEqualToString:@"link"]) { 
     [link appendString:string]; 
    } 
} 


-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 

    if ([[segue identifier] isEqualToString:@"showDetail"]) { 
     NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow]; 
     NSString *string = [feeds[indexPath.row] objectForKey:@"link"]; 
     [[segue destinationViewController] setUrl:string]; 
    } 
} 
@end 

У кого-нибудь есть идеи?

+2

Какая у вас проблема с опубликованным кодом? – rmaddy

+0

"" Я пытаюсь реализовать функцию pull-to-refresh в моей таблице RSS-каналов. Список обычно загружается при загрузке приложения, но мне по существу нужно реплицировать его для выпадающего списка. Может ли кто-нибудь помочь, почему код не работает? »« – GlenRitchie

+0

Повторяя то, что вы уже задали в своем вопросе, не объясняет вашу проблему еще раз. У вас уже есть код, который обрабатывает pull-to-refresh и перезагружает таблицу. Поэтому вам нужно объяснить, с какой проблемой вы столкнулись с опубликованным кодом. – rmaddy

ответ

0

Код не работает Необходимо устранить ошибку в строке parserDidEndDocument с ошибкой.

Затем я должен был добавить [feeds removeAllObjects] под строку //Refresh Logic, чтобы очистить содержимое текущей таблицы.

Спасибо, ребята.