我尝试加载数组并在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;
}
答案 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安全的方法来实例化一个只能实例化一次的单例。