2015-01-20 2 views
-1

Во-первых, извините, если заголовок сбивает с толку, я не уверен, как еще это сложить. Я кратко объясню свое приложение.Передайте NSObject (условные данные) в TableView

Пользователь для входа в систему экрана (очень основной, ни на стороне сервера вещи), в котором они могут войти в трех различных компаний (Company A, Company B, and Company C) в таком порядке. После того, как пользователь успешно выполнил вход в систему Company A, они представлены в TableView. LoginViewController (нормальный ViewController) загружает файл ListOfClinics.xml из Dropbox и анализирует его с помощью 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 представлен списком Клиентов, которые зарегистрированы в Манчестерской клинике.

Update

Я создал новый класс 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

Я использую раскадровку с перетекает нажать на следующий вид. Должен ли я использовать 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 записей с 100 foreName атрибутами, все 100 значений сохраняются или только последние?

Я до сих пор не знаю, что тест делать здесь и только передать соответствующие данные в следующем виде (то есть., Если пользователь нажимает на Manchester, пройти все клиенты с Clinic_Location из Manchester к следующему представлению). Должен ли я создать новый класс NSObject для хранения данных ListOfClinics.xml и проверить его на значение CLinic_Location в моем ClientData NSObject?

ответ

1

Создайте простой объект структуры данных и передайте это.

@interface ClientData 
@property (strong) NSString *foreName; 
@property (strong) NSString *surName; 
// etc. 
@end 

@interface TargetViewController 
@property (strong) ClientData *clientData; 
@end 
+0

Спасибо за ответ. Пожалуйста, см. Мое обновленное сообщение: я реализовал ваше решение, но я борюсь с передачей только соответствующих данных в следующий вид (см. Последний абзац). – rosshump

+0

Вы должны использовать 'clientData.clinicLocation = clinicLocation' или' [clientData setClinicLocation: clinicLocation] 'вместо' [clientData setValue: clinicLocation forKey: @ "clinicLocation"] '. Эти методы уже созданы для вас, когда вы используете '@ property'. –

+0

Хорошо спасибо, это удобно знать! Я обновил свой вопрос с вашим кодом. Кажется, что это хорошо работает, теперь я могу передать некоторые данные, такие как 'foreName', хотя передается только последнее проанализированное значение foreName. Всегда ли перезаписываются значения в моем классе 'NSObject'? У меня есть более 100 клиентских записей, поэтому, например, если в Манчестере есть 10 тегов «Clinic_Location», когда я нажимаю на «Манчестер», я должен увидеть этих 10 клиентов и все подробности («surName, адрес, почтовый индекс» и т. Д.). Я подошел к этому неправильно? Я не хотел усложнять работу с Core Data ... – rosshump

1

В prepareForSegue, pcClients чужого имущества clientData является nil, если вы назначаете его свойство Forename любое значение не будет сохранено, поскольку это не имеет выделенной памяти, чтобы сохранить его. Вы можете сделать это, чтобы решить вашу проблему:

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

Спасибо за ответ. Я обновил свой вопрос с помощью вашего решения, но «NSLog» по-прежнему отображает «(null)» при передаче данных в следующее представление? – rosshump

+1

'NSLog' по-прежнему отображает' (null) ', потому что вы печатаете значение перед его назначением. –

+0

D'oh, вы правы, извините за глупость! – rosshump

Смежные вопросы