将NSObject(条件数据)传递给TableView

时间:2015-01-20 19:32:27

标签: ios objective-c nsxmlparser nsobject key-value-coding

首先,如果标题令人困惑,我很抱歉,我不确定如何说出来。我将简要解释一下我的应用程序。

用户会看到一个登录屏幕(非常基本,没有服务器端的东西),他们可以按特定顺序登录到三个不同的公司(Company A, Company B, and Company C)。用户成功登录Company A后,系统会显示TableViewLoginViewController(普通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>

ClinicViewControllerTableViewController。在填充表格时,应用程序从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);字符串,则输出正确。

KVC output

我正在使用带有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值对其进行测试吗?

2 个答案:

答案 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的属性clientDatanil,如果您为其属性forename分配任何值,它将无法保存,因为它没有内存分配保存它。 您可以这样做来解决您的问题:

pcClients.clientData = [ClientData alloc] init];
pcClients.clientData.foreName = foreName;