2014-02-08 7 views
0

Это мое первое приложение для iOS, поэтому были бы весьма полезны подробные инструкции о том, как исправить. Я пытаюсь реализовать pull для обновления, чтобы таблица XML обновила данные. В настоящее время работает анимация для обновления анимации, но данные не обновляются.UIRefreshControl не обновляет мой XML-табличный вид

Поддержка, которую я получил до сих пор, недостаточно детально, чтобы помочь. Кажется, что я близок к тому, чтобы обновить работу, но я официально тупик. NSLog возвращает ... 2014-02-08 11: 24: 58.483 MyApp [3186: 70b] обновляется. Может кто-то вставить исправление в мой код? Спасибо!

#import "MasterViewController.h" 

#import "DetailViewController.h" 

@interface MasterViewController() { 
    NSXMLParser *parser; 
    NSMutableArray *feeds; 
    NSMutableDictionary *item; 
    NSMutableString *title; 
    NSMutableString *link; 
    NSString *element; 
} 
@end 

@implementation MasterViewController 

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

// Paste Blog feed here 
- (void)viewDidLoad { 
    [super viewDidLoad]; 
    feeds = [[NSMutableArray alloc] init]; 
    NSURL *url = [NSURL URLWithString:@"http://www.placeholder.xml"]; 
    parser = [[NSXMLParser alloc] initWithContentsOfURL:url]; 
    [parser setDelegate:self]; 
    [parser setShouldResolveExternalEntities:NO]; 
    [parser parse]; 
    UIRefreshControl *refreshControl = [UIRefreshControl new]; 
    [refreshControl addTarget:self 
       action:@selector(refresh:) 
     forControlEvents:UIControlEventValueChanged]; 
    refreshControl.attributedTitle = 
    [[NSAttributedString alloc] initWithString:@"Pull to refresh..."]; 
    self.refreshControl = refreshControl; 
} 

- (void)refresh:(UIRefreshControl *)sender { 
    // ... your refresh code 
NSLog(@"refreshing..."); 
    NSURL *url = [NSURL URLWithString:@"http://www.placeholder.xml"]; 
    NSURLRequest *request = [NSURLRequest requestWithURL:url]; 
    (void)[[NSURLConnection alloc] initWithRequest:request delegate:self]; 

    [sender endRefreshing]; 
} 

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

#pragma mark - Table View 

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

- (NSInteger)tableView:(UITableView *)tableView 
numberOfRowsInSection:(NSInteger)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)parserDidEndDocument:(NSXMLParser *)parser { 

    [self.tableView reloadData]; 
} 

- (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 
+1

Где ваши делегаты NSURLConnection? Также вы используете один и тот же URL-адрес, тогда как вы получите разные данные? –

+0

Действительно ли ваш код достигает обновления: метод? Поставьте там NSLog и сообщите нам об этом. Если нет, это проблема управления обновлением. Если вызов refresh: сделан, тогда у вас проблемы с вашим методом NSURLConnection, как говорит Midhun. Возможно, лучшей альтернативой в iOS7 теперь является NSURLSession с хорошим обработчиком завершения, поэтому вы можете поместить там весь свой код обновления. –

+0

Это не освежает данные. Я получаю сообщение только для обновления анимации. Можете ли вы вставить исправление в свой код? Как я уже упоминал, это мое первое приложение. – user3251476

ответ

0

Этот код сработал, как только пользователь тянет к обновлению на ваш Tableview:

- (void)refresh:(UIRefreshControl *)sender { 
    // ... your refresh code 
    NSURL *url = [NSURL URLWithString:@"http://www.placeholder.xml"]; 
    NSURLRequest *request = [NSURLRequest requestWithURL:url]; 
    (void)[[NSURLConnection alloc] initWithRequest:request delegate:self]; 

    [sender endRefreshing]; 
} 

Что вы делаете здесь говорят контроль обновления, чтобы закончить освежающие сразу после пользователь запустил обновление.

Вы не должны вызывать -endRefreshing до тех пор, пока ваша операция URLConnection/parsing/refresh не завершится .

+0

Итак, где я должен перемещать endRefreshing? – user3251476

+0

@ user3251476 ну, так как вы выполняете сетевой запрос как часть операции обновления, как насчет завершения вашего сетевого запроса? или если вы собираетесь обрабатывать результаты запроса (проанализируйте его, независимо от того), вы можете сделать это, когда * тот * закончит. –

0

Вы можете заменить свое обновление: методом с этим. Он основан на новом методе NSURLSession, и вы должны заменить комментарии в теле обработчика завершения своим вызовом для обработки ваших xml-данных и обновления вашей таблицы.

- (void)refresh:(UIRefreshControl *)sender 
{ 
    // ... your refresh code 
    [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES]; 

    NSURLSession *session = [NSURLSession sharedSession]; 
    [[session dataTaskWithURL:[NSURL URLWithString:@"http://www.placeholder.xml"] 
      completionHandler:^(NSData *data, 
           NSURLResponse *response, 
           NSError *error) { 

       // handle response 
       NSXMLParser *updatedParser = [[NSXMLParser alloc] initWithData:data]; 
       [updatedParser parse]; 

       [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO]; 
      }] resume]; 
    [sender endRefreshing]; 
} 
+0

Так что вставка этого кода должна исправить мою проблему? Вы упомянули, что я должен заменить комментарии в теле обработчика завершения ... можете ли вы предоставить более подробную информацию? Большое вам спасибо за помощь Мартина. – user3251476

+0

У меня нет опыта работы с синтаксическим анализатором xml, но на основе вашего угадывания кода просто загрузка данных и запрос на его анализ снова будет достаточно. Я обновил код. –

+0

К сожалению, это все еще не работает ... любые другие идеи? Я ценю помощь. – user3251476

Смежные вопросы