我创建的应用程序几乎是Apple的SeismicXML示例应用程序的克隆,因此我可以了解NSXMLParser
的细节。我创建了我自己的.xml
文件,并将SeismicXML应用程序中的大部分代码(如果不是全部)复制到我的应用程序XMLTest中。除了一部分外,一切似乎都很好。应用程序运行时,所有文本字段都显示相同的数据。无论我将textField.text
设置为显示的解析的哪个属性,它都显示相同的数据,这恰好是解析的最后一个元素。
在调试期间,我进入了解析操作并实现了许多NSLog
语句,以查看正在解析的数据。所有NSLog
语句都显示正在解析.xml文件的正确元素并将其设置为正确对象的正确属性。
我不确定我的代码的哪一部分是错的,而且我已经自己调试了这个应用程序太多小时了。我认为代码中包含的部分内容可能是问题的罪魁祸首。
在此代码段中,两个标签的值是相同的,它不应该是。
@implementation VTSVehicleTableViewCell
-(void)configureWithVehicle:(VTSVehicle *)vehicle {
self.stockLabel.text = vehicle.stock;
self.infoLabel.text = vehicle.year;
}
以下是模拟器中生成的内容:
但是,在此方法的内部,它在控制台中生成以下正确信息:
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
if (_accumulatingParsedCharacterData) {
// If the current element is one whose content we care about, append 'string'
// to the property that holds the content of the current element.
//
NSLog(@"%@", string);
[self.currentParsedCharacterData appendString:string];
NSLog(@"%@", string);
}
}
它就像车辆对象在解析xml期间和之后都有正确的数据,但是当我去更新视图时,车辆对象中的数据现在只填充了最后一个数据。 xml文件的元素。这是xml文件的样子:
<vehicles published="2014-04-02">
<vehicle>
<stock>003737</stock>
<serial>WVWDM7AJ2BW166848</serial>
<year>2011</year>
<make>VOLKSWAGEN</make>
<model>GOLF</model>
<date>01/05/11</date>
<price>26540.00</price>
<invoice>25414.00</invoice>
<trim>4DR TDI 6SP AUT</trim>
</vehicle>
<vehicle>
<stock>003974</stock>
<serial>3VWLL7AJ1CM317028</serial>
<year>2012</year>
<make>VOLKSWAGEN</make>
<model>JETTA</model>
<date>11/03/11</date>
<price>0.00</price>
<invoice></invoice>
<trim>2.0L TDI 6SP AUTO</trim>
</vehicle>
<vehicle>
<stock>004104</stock>
<serial>1VWBH7A38CC061891</serial>
<year>2012</year>
<make>VOLKSWAGEN</make>
<model>PASSAT</model>
<date>03/05/12</date>
<price>26665.00</price>
<invoice>25555.00</invoice>
<trim>SE W/SR 2.5 6SP AUTO</trim>
</vehicle>
</vehicles>
为什么文本标签显示相同的数据,即使它们是从同一对象的不同属性中提取的呢?
编辑:以下是cellForRowAtIndexPath
的代码:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *kVehicleCellID = @"VehicleCellID";
VTSVehicleTableViewCell *cell = (VTSVehicleTableViewCell *)[tableView dequeueReusableCellWithIdentifier:kVehicleCellID];
// Get the specific vehicle for this row.
VTSVehicle *vehicle = (self.vehicleList)[indexPath.row];
[cell configureWithVehicle:vehicle];
return cell;
}
以下是tableViewCell的代码:
#import "VTSVehicleTableViewCell.h"
#import "VTSVehicle.h"
@interface VTSVehicleTableViewCell ()
// References to the subviews which display the earthquake data.
@property (nonatomic, weak) IBOutlet UILabel *stockLabel;
@property (nonatomic, weak) IBOutlet UILabel *infoLabel;
@end
@implementation VTSVehicleTableViewCell
-(void)configureWithVehicle:(VTSVehicle *)vehicle {
self.stockLabel.text = vehicle.stock;
self.infoLabel.text = vehicle.year;
}
@end
答案 0 :(得分:0)
问题不在foundCharacters
,而在didStartElement
或didEndElement
更有可能。可能发生的情况是,您有一个NSMutableString
实例,您为每个元素反复使用,然后在模型中使用该元素值。
在currentParsedCharacterData
中保存didEndElement
的结果时,您应该确保复制该值(而不仅仅是使用对现有NSMutableString
的引用。例如,您可以使用NSString
属性定义为copy
属性,而不是strong
属性。或者,如果您只是将其放入字典或数组中,请使用{ {1}}而不仅仅是[self.currentParsedCharacterData copy]
。这将确保您在模型中保存的每个元素最终都作为单独的currentParsedCharacterData
实例(顺便说一下,确保这些对象不再是变)。
很明显,正如亚马逊所说,NSString
可能存在一个简单的问题,但我怀疑cellForRowAtIndexPath
代码更可能是罪魁祸首。