1

我试图加载一个数组并在 tableview 上显示数组项。我的 tableview 只显示 Web 服务的一个字段。

例如,如果分支名称是 ABC.Tableview 显示我 40 ABC 行 Tableview 有 40 个相同的项目。我想加载所有 40 个项目

我的代码:

我的阵列

NSMutableArray *myArray;

解析 XML 代码

-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName    namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:    (NSDictionary *)attributeDict
{
    if ( [elementName isEqualToString:@"Branchnames"] ) {
        if (!retornoSOAP) {
        myArray = [[NSMutableArray alloc] init];
        }
    teveRetorno = YES;
    }
}
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
    if (teveRetorno) {
        [myArray addObject:string];
        NSLog(@"My Array %@",myArray);
    }
}
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{
    if ( [elementName isEqualToString:@"Branchnames"] ) {
        NSLog(@"My Array %@",myArray);
       [[self tableView]reloadData];
       retornoSOAP = nil;
       teveRetorno = NO;
    }
}

表代码:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{

   return 40;
}

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

    // Return the number of rows in the section.
    return [self.myArray count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
   static NSString *CellIdentifier = @"Cell";
   UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
   if (cell == nil) {
      cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
   }
 cell.textLabel.text =[myArray objectAtIndex:indexPath.row];
 return cell;
}
4

2 回答 2

1

对于我的数据模型,我通常会创建一个暴露给 XMLParser 和我的 ViewController 的单例,这样当我解析我的 XML 时......

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
    if ([elementName isEqualToString:@"rootElement"])
    {
        currElement = [[mySingleton alloc] init];
        currentElement.currentElementAttribute = [attributeDict objectForKey:@"type"];
    }
    else if ([elementName isEqualToString:@"somethingElse"])
    {
       //don't need to init another currElement here
    }
  }

我可以对我的 ViewController 中的数据做任何我想做的事情......

self.myLabel.text = currElement.currentElementAttribute;

当然,这在使用 NSMutableDictionary 或 NSArray 时也应该有效。通常我会像这样创建我的单例......

+ (NSMutableDictionary *)mySingletonDictionary
{
    static NSMutableDictionary *singletonInstance = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        singletonInstance = [[NSMutableDictionary alloc]init];
    });
    return singletonInstance;
}

这是一种实例化只能实例化一次的单例的 Arc 安全方法。

于 2013-06-12T12:14:26.977 回答
1

问题在于这一行:

myArray = [[NSMutableArray alloc] init];

每次Branchnames标签出现时,您都在分配数组。所以数组会丢失之前的内容。并且只会插入最后一个对象。

实现如下方法:

-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName    namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:    (NSDictionary *)attributeDict
{
   if ( [elementName isEqualToString:@"Branchnames"] )
   {
     teveRetorno = YES;
   }
   else if ([elementName isEqualToString:@"yourTopLevelXMLTag"]) //yourTopLevelXMLTag = ArizalarGetirResult
   {
     myArray = [[NSMutableArray alloc] init];
   }
}

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

    [myArray addObject:string];

  }
}

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
  if ( [elementName isEqualToString:@"Branchnames"] )
  {
    teveRetorno = NO;
  }
  else if ([elementName isEqualToString:@"yourTopLevelXMLTag"]) //yourTopLevelXMLTag = ArizalarGetirResult
  {
    [[self tableView]reloadData];
  }
}
于 2013-06-12T11:56:19.827 回答