UITableView只有一个字段

时间:2013-06-12 11:08:27

标签: objective-c uitableview

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

例如,如果branchname是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;
}

2 个答案:

答案 0 :(得分: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];
  }
}

答案 1 :(得分: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安全的方法来实例化一个只能实例化一次的单例。