【问题标题】:XML Parsing data not getting from viewController to tableViewController in objective c?XML解析数据没有从目标c中的viewController到tableViewController?
【发布时间】:2017-07-27 15:12:21
【问题描述】:

我成功地从服务器获取 xml 数据,但我无法将该数据从 viewController 正确发送到 tableViewController。我到底想做什么发送数据,这是我的代码......

在视图控制器中...

- (IBAction)parserButtonClicked:(UIButton *)sender {

    [self.appTitleArray removeAllObjects];
    [self.releaseDateArray removeAllObjects];
    [self.summeryArray removeAllObjects];
    [self.priceArray removeAllObjects];
    [self.imageArray removeAllObjects];

    DisplayAppsTableViewController *datvc = [self.storyboard instantiateViewControllerWithIdentifier:@"DATVC"];

    if ((self.countrySegmentControl.selectedSegmentIndex == 0 || self.countrySegmentControl.selectedSegmentIndex == 1 || self.countrySegmentControl.selectedSegmentIndex == 2) && (self.categorySegmentControl.selectedSegmentIndex == 0 || self.categorySegmentControl.selectedSegmentIndex == 1) && (self.countSegmentControl.selectedSegmentIndex == 0 || self.countSegmentControl.selectedSegmentIndex == 1 || self.countSegmentControl.selectedSegmentIndex == 2 || self.countSegmentControl.selectedSegmentIndex == 3)) {

        [self stringManipulation];
//This is the link rom stringManipulation method
// https://itunes.apple.com/in/rss/topfreeapplications/limit=10/xml
// https://itunes.apple.com/in/rss/toppaidapplications/limit=10/xml

self.URLRequest = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:self.XMLurl]];

self.URLSession = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];

self.dataTask = [self.URLSession dataTaskWithRequest:self.URLRequest completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {

        self.XMLParser = [[NSXMLParser alloc]initWithData:data];

        self.XMLParser.delegate = self;

        BOOL success = [self.XMLParser parse];

            if (success) {
                NSLog(@"Parse success");
            } else {
                NSLog(@"Parse not success");
            }

     }];
        [self.dataTask resume];

}

    datvc.appTitleArray1 = self.appTitleArray;
    datvc.releaseDateArray1 = self.releaseDateArray;
    datvc.priceArray1 = self.priceArray;
    datvc.summeryArray1 = self.summeryArray;
    datvc.imageArray1 = self.imageArray;
    NSLog(@"Here it's NOT printing data successfully : %@", datvc.appTitleArray1);

    [self.navigationController pushViewController:datvc animated:YES];

}

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

    self.element = elementName;

   if([elementName isEqualToString:@"im:releaseDate"]) {

        NSString *date=[attributeDict objectForKey:@"label"];
    [self.releaseDateArray addObject:date];
   }

}

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

    NSString *trimmedString = [string stringByTrimmingCharactersInSet:
                           [NSCharacterSet whitespaceAndNewlineCharacterSet]];

    if (trimmedString.length > 0) {

        if ([self.element isEqualToString:@"im:name"]) {
        [self.appTitleArray addObject:string];
        }
        if ([self.element isEqualToString:@"summary"]) {
        [self.summeryArray addObject:string];
        }
        if ([self.element isEqualToString:@"im:price"]) {
        [self.priceArray addObject:string];
        }
        if ([self.element isEqualToString:@"im:image"]) {
        [self.imageArray addObject:string];
        }

    }

    NSLog(@"Here it's parsing data successfully : %lu",     [self.appTitleArray count]);
}

在tableViewController中

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {

    NSLog(@"Not getting data from viewController : %lu",  [self.releaseDateArray1 count]);

    return [self.releaseDateArray1 count];
}

【问题讨论】:

  • 改变导航调用的顺序

标签: ios objective-c xml uiviewcontroller xml-parsing


【解决方案1】:
  if (success) 
 {
    NSLog(@"Parse success");
    datvc.appTitleArray1 = self.appTitleArray;
    datvc.releaseDateArray1 = self.releaseDateArray;
    datvc.priceArray1 = self.priceArray;
    datvc.summeryArray1 = self.summeryArray;
    datvc.imageArray1 = self.imageArray;
    NSLog(@"Here it's NOT printing data successfully : %@",         datvc.appTitleArray1);

    [self.navigationController pushViewController:datvc animated:YES];
 } 
else 
{
     NSLog(@"Parse not success");
}

请尝试一下,因为您在解析之前设置数据。

【讨论】:

  • 会成功阻塞吗?
  • 它会立即从服务器获取数据,但只是导航需要一些时间
【解决方案2】:

不喜欢

DisplayAppsTableViewController *datvc = [self.storyboard instantiateViewControllerWithIdentifier:@"DATVC"];

    if ((self.countrySegmentControl.selectedSegmentIndex == 0 || self.countrySegmentControl.selectedSegmentIndex == 1 || self.countrySegmentControl.selectedSegmentIndex == 2) && (self.categorySegmentControl.selectedSegmentIndex == 0 || self.categorySegmentControl.selectedSegmentIndex == 1) && (self.countSegmentControl.selectedSegmentIndex == 0 || self.countSegmentControl.selectedSegmentIndex == 1 || self.countSegmentControl.selectedSegmentIndex == 2 || self.countSegmentControl.selectedSegmentIndex == 3)) {

        [self stringManipulation];
//This is the link rom stringManipulation method
// https://itunes.apple.com/in/rss/topfreeapplications/limit=10/xml
// https://itunes.apple.com/in/rss/toppaidapplications/limit=10/xml

self.URLRequest = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:self.XMLurl]];

self.URLSession = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];

self.dataTask = [self.URLSession dataTaskWithRequest:self.URLRequest completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {

        self.XMLParser = [[NSXMLParser alloc]initWithData:data];

        self.XMLParser.delegate = self;

        BOOL success = [self.XMLParser parse];

            if (success) {
                NSLog(@"Parse success");
            } else {
                NSLog(@"Parse not success");
            }

     }];
        [self.dataTask resume];

}

    datvc.appTitleArray1 = self.appTitleArray;
    datvc.releaseDateArray1 = self.releaseDateArray;
    datvc.priceArray1 = self.priceArray;
    datvc.summeryArray1 = self.summeryArray;
    datvc.imageArray1 = self.imageArray;
    NSLog(@"Here it's NOT printing data successfully : %@", datvc.appTitleArray1);

    [self.navigationController pushViewController:datvc animated:YES];

喜欢

原因:你被称为附加线程,在执行成功后需要额外的执行时间。

    if ((self.countrySegmentControl.selectedSegmentIndex == 0 || self.countrySegmentControl.selectedSegmentIndex == 1 || self.countrySegmentControl.selectedSegmentIndex == 2) && (self.categorySegmentControl.selectedSegmentIndex == 0 || self.categorySegmentControl.selectedSegmentIndex == 1) && (self.countSegmentControl.selectedSegmentIndex == 0 || self.countSegmentControl.selectedSegmentIndex == 1 || self.countSegmentControl.selectedSegmentIndex == 2 || self.countSegmentControl.selectedSegmentIndex == 3)) {

        [self stringManipulation];
//This is the link rom stringManipulation method
// https://itunes.apple.com/in/rss/topfreeapplications/limit=10/xml
// https://itunes.apple.com/in/rss/toppaidapplications/limit=10/xml

self.URLRequest = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:self.XMLurl]];

self.URLSession = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];

self.dataTask = [self.URLSession dataTaskWithRequest:self.URLRequest completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {

        self.XMLParser = [[NSXMLParser alloc]initWithData:data];

        self.XMLParser.delegate = self;

        BOOL success = [self.XMLParser parse];

            if (success) {
                NSLog(@"Parse success");

               dispatch_sync(dispatch_get_main_queue(), ^{
// Update the UI on the main thread.





                   DisplayAppsTableViewController *datvc = [self.storyboard instantiateViewControllerWithIdentifier:@"DATVC"];
                  datvc.appTitleArray1 = self.appTitleArray;
    datvc.releaseDateArray1 = self.releaseDateArray;
    datvc.priceArray1 = self.priceArray;
    datvc.summeryArray1 = self.summeryArray;
    datvc.imageArray1 = self.imageArray;
    NSLog(@"Here it's NOT printing data successfully : %@", datvc.appTitleArray1);

    [self.navigationController pushViewController:datvc animated:YES];
     });
            } else {
                NSLog(@"Parse not success");
            }

     }];
        [self.dataTask resume];

}

【讨论】:

  • 是的,它工作成功,但它会立即导航
  • @VadlaniMarking - 数据是否正在接收,否则您还需要其他任何东西
  • @VadlaniMarking - 好的,您面临的问题需要与此相关的任何替代想法,或者您需要什么样的输出
  • @VadlaniMarking - 等待
  • 我想将获取的数据打印到 tableViewController
猜你喜欢
  • 2014-05-09
  • 1970-01-01
  • 2011-10-22
  • 1970-01-01
  • 1970-01-01
  • 2011-05-13
  • 2011-07-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多