首先,如果标题令人困惑,我很抱歉,我不确定如何说出来。我将简要解释一下我的应用程序。
用户会看到一个登录屏幕(非常基本,没有服务器端的东西),他们可以按特定顺序登录到三个不同的公司(Company A, Company B, and Company C)
。用户成功登录Company A
后,系统会显示TableView
。 LoginViewController
(普通ViewController
)从Dropbox下载ListOfClinics.xml
文件,并使用NSXMLParser
对其进行解析,并将对象传递给ClinicsViewController
以显示诊所位置。
ListOFClinics.xml
示例:
<Clinic>
<Location>
<Clinic_Location>Manchester</Clinic_Location>
</Location>
<Location>
<Clinic_Location>Liverpool</Clinic_Location>
</Location>
<Location>
<Clinic_Location>Birmingham</Clinic_Location>
</Location>
<Location>
<Clinic_Location>London</Clinic_Location>
</Location>
<Location>
<Clinic_Location>Leeds</Clinic_Location>
</Location>
</Clinic>
ClinicViewController
是TableViewController
。在填充表格时,应用程序从Dropbox(Clients.xml
)下载另一个文件并解析它以供使用。我们的想法是,用户可以点按包含某个位置的TableView cell
,例如曼彻斯特,而Clients.xml
中新解析的数据应该传递到下一个视图(ClientsViewController
)并且显示所有在曼彻斯特诊所注册的客户。
Clients.xml
示例:
<Client>
<Clinic_Location>Manchester</Clinic_Location>
<Client_Forename>Frank</Client_Forename>
<Client_Surname>Wade</Client_Surname>
<Client_Address_Line_1>Law Lane</Client_Address_Line_1>
<Client_Address_Line_2>Money House</Client_Address_Line_2>
<Client_Address_Line_3>Didsbury</Client_Address_Line_3>
<Client_Address_Line_4>Manchester</Client_Address_Line_4>
<Client_Address_Line_5></Client_Address_Line_5>
<Client_Postcode>M20 2WS</Client_Postcode>
<Client_Tel>01615559090</Client_Tel>
<Appt_Time>15:30</Appt_Time>
<Appointment_Attended>Booked</Appointment_Attended>
<Passed_To_Medical>Complete Pass</Passed_To_Medical>
<Passed_To_Sol>no</Passed_To_Sol>
</Client>
<Client>
...
</Client>
如您所见,两个.xml文件都有Clinic_Location
元素。我不太担心错误检查以确保这些数据匹配(.xml文件通过另一个系统导出,因此两者应该具有相同的位置)。我需要实现的是,当有人点击曼彻斯特时,下一个TableView
会显示一个在曼彻斯特诊所注册的客户列表。
更新
我创建了一个新的NSObject
类,声明ClientData.h中的所有属性并在ClientData.m
中合成它们。
ClientData.h
@interface ClientData : NSObject
@property (strong) NSString *clinicLocation;
@property (strong) NSString *foreName;
...
ClientData.m
@implementation ClientData
@synthesize clinicLocation;
@synthesize foreName;
...
下面是我的解析器组件的片段,使用KVC存储解析的数据。
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
if ([elementName isEqualToString:@"Client"]) {
// save to data structure object with KVC
ClientData *clientData = [[ClientData alloc]init];
clientData.clinicLocation = clinicLocation
clientData.foreName = foreName;
...
// count number of clients
clientCount++;
[client setObject:clinicLocation forKey:@"Clinic_Location"];
[client setObject:foreName forKey:@"Client_Forename"];
...
[dataStart addObject:[client copy]];
}
}
如果我使用NSObject
等记录NSLog(@"Forename: %@", clientData.foreName);
字符串,则输出正确。
我正在使用带有segues的故事板来推送下一个视图。我应该实施prepareForSegue
来传递NSObject (ClientData)
还是tableView didSelectRowAtIndexPath
?这是我尝试过的:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([[segue identifier] isEqualToString:@"showClients"]) {
// clientData is declared on the destinationViewController
PCClientsViewController *pcClients = segue.destinationViewController;
pcClients.clientData = [[ClientData alloc]init];
pcClients.clientData.foreName = foreName;
}
}
这是有效的,但只有一个foreName
值传递到下一个TableView
。我的NSObject
课程每次只分配一个值时才会存储一个值吗?换句话说,如果我使用100个foreName
属性解析100条记录,那么所有100个值是保持不变还是只保留最后一个?
我仍然不知道在这里做什么测试,只将相关数据传递到下一个视图(即,如果用户点击Manchester
,则传递Clinic_Location
{{}的所有客户端{1}}到下一个视图)。我应该创建一个新的Manchester
类来存储NSObject
数据,并根据ListOfClinics.xml
中的CLinic_Location
值对其进行测试吗?
答案 0 :(得分:1)
创建一个简单的数据结构对象并传递它。
@interface ClientData
@property (strong) NSString *foreName;
@property (strong) NSString *surName;
// etc.
@end
@interface TargetViewController
@property (strong) ClientData *clientData;
@end
答案 1 :(得分:1)
在prepareForSegue
中,pcClients的属性clientData
为nil
,如果您为其属性forename分配任何值,它将无法保存,因为它没有内存分配保存它。
您可以这样做来解决您的问题:
pcClients.clientData = [ClientData alloc] init];
pcClients.clientData.foreName = foreName;