2014-02-08 1 views
0

이것은 내 첫 번째 iOS 앱이므로 수정 방법에 대한 자세한 설명을 매우 기뻐할 것입니다. 내 XML 테이블이 데이터를 새로 고칠 수 있도록 새로 고침을 구현하려고합니다. 현재 애니메이션 새로 고침이 작동하지만 데이터가 새로 고침되지 않습니다.UIRefreshControl이 XML 테이블 뷰를 새로 고치지 않습니다.

지금까지받은 지원에 대한 세부 설명이 충분하지 않았습니다. 나는 일하는 새로 고침에 가까워 보인다. 그러나 나는 공식적으로 난처하게하게된다. NSLog는 다음을 반환합니다. 2014-02-08 11 : 24 : 58.483 MyApp [3186 : 70b] 누군가 내 코드에 수정 사항을 붙여 넣을 수 있습니까? 고맙습니다!

- (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]; 
} 

뭘 새로 고침 제어를 말하고 여기에서하고있는 후 상쾌한 즉시을 종료 :

#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

코드가 실제로 refresh : 메소드에 도달 했습니까? NSLog를 설치하고 저희에게 알려주십시오. 그렇지 않은 경우 새로 고침 제어 문제입니다. 새로 고침 :을 호출하면 Midhun이 말한 것처럼 NSURLConnection 메서드에 문제가 있습니다. 어쩌면 iOS7의 더 나은 대안은 이제 NSURLSession이 멋진 완성 처리기이므로 모든 업데이트 코드를 거기에 넣을 수 있습니다. –

+0

데이터가 새로 고쳐지지 않습니다. 애니메이션을 새로 고침하기 만하면됩니다. 수정 코드를 코드에 붙여 넣을 수 있습니까? 내가 언급했듯이, 이것은 나의 첫 번째 앱이다. – user3251476

답변

0

이 코드는 사용자가 끌어-에 새로 고침로있는 tableview에 즉시 트리거됩니다 사용자가 새로 고침을 시작했습니다.

URL 연결/구문 분석/새로 고침 작업이 으로 완료 될 때까지 -endRefreshing을 호출하면 안됩니다.

+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

관련 문제