Cómo save nsdictionary de una subvista a una vista principal basada en la selección de tableviewcell

Actualmente estoy parsing algunos xml que se parece a esto

<Rows> <Row MANUFACTURERID="76" MANUFACTURERNAME="Fondont" ISMANU="F" ISAUTO="F"/> <Row MANUFACTURERID="18" MANUFACTURERNAME="Anti" ISMANU="T" ISAUTO="T"/> </Rows> 

Lo analizo para que haya una variedad de dictionarys (cada dictionary tiene los cuatro valores de la Fila en él).

Luego paso ManufacturerName a mi método startSortingTheArray como este

 if (dataSetToParse == @"ICMfg") // ICMfg is a string passed to this view from the parent view cell selection enabling me to pass different data sets to this view { //Filter results (ISAUTO = T) NSPnetworkingicate *pnetworkingicate = [NSPnetworkingicate pnetworkingicateWithFormat:@"%K like %@",@"ISAUTO",@"T"]; NSArray *filtenetworkingArray = [myDataArray filtenetworkingArrayUsingPnetworkingicate:pnetworkingicate]; //Passes Manufacturer strigs over to startSortingtheArray method [self startSortingTheArray:[filtenetworkingArray valueForKey:@"MANUFACTURER"]]; } 

Entonces, desde aquí, todos los nombres de fabricante se envían a mi método como un set de cadenas. Luego utilizo esta matriz para configurar todas mis secciones / index-scroller. El siguiente método muestra cómo hago esto.

 //method to sort array and split for use with uitableview Index - (IBAction)startSortingTheArray:(NSArray *)arrayData { //If you need to sort incoming array alphabetically use this line of code //TODO: Check values coming in for capital letters and spaces etc sortedArray = [arrayData sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)]; //If you want the standard array use this code //sortedArray = arrayData; self.letterDictionary = [NSMutableDictionary dictionary]; sectionLetterArray = [[NSMutableArray alloc] init]; //Index scrolling Iterate over values for future use for (NSString *value in sortedArray) { // Get the first letter and its associated array from the dictionary. // If the dictionary does not exist create one and associate it with the letter. NSString *firstLetter = [[value substringWithRange:NSMakeRange(0, 1)] uppercaseString]; //uppercaseString puts lowercase values with uppercase NSMutableArray *arrayForLetter = [letterDictionary objectForKey:firstLetter]; if (arrayForLetter == nil) { arrayForLetter = [NSMutableArray array]; [letterDictionary setObject:arrayForLetter forKey:firstLetter]; [sectionLetterArray addObject:firstLetter]; // This will be used to set index scroller and section titles } // Add the value to the array for this letter [arrayForLetter addObject:value]; } //Reload data in table [self.tableView reloadData]; } 

desde aquí hago varias cosas para hacer con la configuration de tableview después de [self.tableView reloadData]; se llama, Lo más importante es que establezco la celda con los valores de cadena de la matriz.

 //Display cells with data NSArray *keys = [self.letterDictionary objectForKey:[self.sectionLetterArray objectAtIndex:indexPath.section]]; NSString *key = [keys objectAtIndex:indexPath.row]; cell.textLabel.text = key; 

cuando se selecciona la celda, el valor de la cadena dentro de la celda se envía de vuelta a la vista principal y se usa más tarde como parámetro de búsqueda … Lo que sucede es que estoy configurando varios parameters que se usarán como una cadena de búsqueda.

Mirando hacia atrás en el XML que analicé

 <Rows> <Row MANUFACTURERID="76" MANUFACTURERNAME="Fondont" ISMANU="F" ISAUTO="F"/> <Row MANUFACTURERID="18" MANUFACTURERNAME="Anti" ISMANU="T" ISAUTO="T"/> </Rows> 

Estos son los valores de las columnas dentro de una tabla SQl que tiene un valor de key MANUFACTURERID que también se encuentra en otras tablas que analizo. Me gustaría usar estos valores key para restringir / refinar otras consultas, pero no puedo entender cómo pasarlas a mi vista padre donde configuro todos los parameters de búsqueda, esa es mi pregunta, ¿cómo puedo save el dictionary de valores que está relacionado con la selección de vista de tabla de usuarios de la subvista. Para que luego pueda pasar uno o algunos de esos valores a la subvista de un set de datos diferente para restringir la información que se muestra dependiente de las selects anteriores del usuario.

Esto me tomó aproximadamente una hora para escribir. Espero que tenga sentido, todavía soy bastante nuevo en el desarrollo de iOS y en Objective C, y este concepto realmente está empujando mis capacidades y antes de seguir adelante y terminar teniendo algunas mierdas que tendré que solucionar más adelante. Espero que una o algunos de ustedes podrán prestarme su experiencia en este tipo de esto para que pueda hacerlo bien por primera vez 🙂

Si necesita que aclare algo o le brinde más información que lo ayudará a ayudarme, avíseme.

¡Gracias por adelantado!

El patrón común para pasar información hacia atrás en la jerarquía del controller de vista es usar la delegación. Puede lograr esto en su escenario implementando lo siguiente:

1) Defina un protocolo en SearchParametersViewController, que representa su controller de vista principal que mencionó.

 @protocol SearchParametersViewControllerDelegate <NSObject> @optional - (void)searchOptionsSelected:(NSArray *)selectedSearchOptions; @end 

2) Conforme a ese protocolo en SearchOptionsSelectionViewController, que representa el controller de vista de tabla que tiene una list de selects para elegir. Asegúrese de importar o reenviar-declare la class en que está definido el protocolo (por ejemplo, SearchParametersViewController).

 #import "SearchParametersViewController.h" @interface SearchOptionsSelectionViewController <SearchParametersViewControllerDelegate> 

3) Defina una propiedad de delegado en su SearchOptionsSelectionViewController (suponga que está utilizando ARC en iOS 5.0, 4.x use unsafe_unretained lugar de weak . Use assign si el proyecto usa administración de memory manual). Este object de delegado contendrá una reference a su controller de vista principal (por ejemplo, SearchParametersViewController). No desea que esta propiedad se retenga para evitar retener ciclos / references circulares donde un object hace reference a otro, lo que a su vez tiene una reference al primero y ninguno de los dos objects se desasigna.

 @property (nonatomic, weak) id<SearchParametersViewControllerDelegate> delegate; 

4) Al crear una instancia de la instancia SearchOptionsSelectionViewController dentro de su controller de vista principal (SearchParametersViewController), establezca la propiedad de delegate en la instancia del controller de vista principal representada por la palabra key de self . Esto garantiza que puede enviar el post (y los datos correspondientes) hacia atrás en la jerarquía del controller de vista, pero las relaciones de object permanecen sin acoplarse. Este protocolo de delegado podría ser conformado en cualquier otro controller de vista, no hay relaciones estrechas en el controller de vista de selección con el controller de vista principal, lo único que los vincula es la adopción flexible del protocolo de delegado por el controller de vista de selección.

 SearchOptionsSelectionViewController *selectionViewController = [[SearchOptionsSelectionViewController alloc] init]; selectionViewController.delegate = self; 

5) Finalmente, en el método table- -tableView:didSelectRowAtIndexPath: delegate, pase los datos correspondientes a la fila seleccionada a su controller de vista principal (SearchParametersViewController) mediante el método de delegado que definió en el protocolo SearchParametersViewControllerDelegate. Debe usar el método -respondsToSelector: para asegurarse de que el object delegado realmente implemente el método -searchOptionsSelected: delegate. Para forzar esta implementación, cambie @optional a @requinetworking encima del prototipo del método en la definición de protocolo en el paso # 1. self.someDataArray representa una fuente de datos que está utilizando con el controller de vista de la tabla de selección. Los detalles del método de protocolo de delegado y el (los) object (s) de datos enviados de vuelta al controller de vista padre se pueden cambiar, lo importante aquí es el patrón de delegación y no tener relaciones estrechamente acopladas entre las instancias de cualquiera de las classs, pero especialmente al revés la jerarquía del controller de vista.

 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { if ([self.delegate respondsToSelector:@selector(searchOptionsSelected:)]) { NSArray *selectedObjs = [NSArray arrayWithObject:[self.someDataArray objectAtIndex:indexPath.row]]; [self.delegate searchOptionsSelected:selectedObjs] } } 

6) Implementar el método de delegado dentro de SearchOptionsSelectionViewController.m

 - (void)searchOptionsSelected:(NSArray *)selectedSearchOptions { // do what you need to with selectedSearchOptions array } 

Otras lecturas:

Guía de Fundamentos del Cacao – Delegados y Orígenes de Datos

Principales Competencias del Cocoa – Protocolo

Puede usar el delegado de la aplicación para lograr sus objectives aquí.

Supongo que tu aplicación tiene una estructura similar a esta. Disculpe la crudeza de este model.

 Application delegate (A) --> Search Options View (B) --> Table where you do selections (C) | | --> Some other view where you need the selection (D) 

Su problema es que necesita información para que fluya de C a D.

Su delegado de la aplicación tiene el mérito de ser universalmente accesible a través de [[UIApplication shanetworkingApplication] delegate] . Entonces puedes get un puntero desde cualquier parte. Desde C, puede enviar su información de selección a A. A puede enviar esto automáticamente a D, o D puede solicitarlo a A cuando lo desee.

Un par de puntos:

  • No voy a ampliar más mi respuesta en este momento porque ahora es la hora de la cerveza, además podría haber entendido mal su requerimiento. Si necesita algo más, me levantaré a las 24 horas del día en la hora del Reino Unido, por lo que podría haber algún retraso.
  • Algunas personas fruncen el ceño al usar el delegado de la aplicación como un "volcado de datos" de la manera que sugerí. Algunas de esas personas prefieren configurar una class de singleton completa y tratarla como un volcado de datos en su lugar. Parece ser uno de esos arguments interminables, así que trato de no involucrarme.