Implementación de una function de historial de búsqueda en iOS

Tengo una página de búsqueda en este momento que cargará una list de resultados para un service web, pero cuando regrese a la página de búsqueda, me gustaría " save " lo que se haya ingresado (por ejemplo, 'rest italiano') y luego visualice esa input y las inputs anteriores en una vista de tabla a continuación, como en la siguiente image:

introduzca la descripción de la imagen aquí

Mi plan era utilizar la serialization de la list de properties; si aún no hay una list, cree una list de properties llamada history.plist y rellénela con cada término de búsqueda que se realice, y visualice los diez más cercanos en la vista de tabla como arriba.

Lo que he probado:

// should create history.plist - (NSString *)dataFilePath { NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentationDirectory, NSUserDomainMask, YES); NSString *documentsDirectory = [paths objectAtIndex:0]; return [documentsDirectory stringByAppendingString:@"history.plist"]; } /* This is the action for when 'search' is clicked - calls the method above to create a new plist if it's not already created. I then try to display the contents of the of the file in the textfield itself (for testing purposes) but it's not saving/displaying properly at the moment. */ - (IBAction)saveHistory:(id)sender { NSString *filePath = [self dataFilePath]; if([[NSFileManager defaultManager] fileExistsAtPath:filePath]) { NSArray *array = [[NSArray alloc] initWithContentsOfFile:filePath]; for (int i = 0; i < (sizeof(array)); i++) { UITextField *theField = self.searchHistory; theField.text = [NSString stringWithFormat:@"%@", array]; } } UIApplication *app = [UIApplication shanetworkingApplication]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationWillResignActive:) name:UIApplicationWillResignActiveNotification object:app]; } 

Cualquier enlace a tutoriales que intentan hacer esto, sugerencias sobre lo que debería hacer, o mejoras a lo que tengo, sería muy apreciado.

Esto debería solucionar el problema:

 // This is inside viewDidLoad UIApplication *myApp = [UIApplication shanetworkingApplication]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationDidEnterBackground:) name:UIApplicationDidEnterBackgroundNotification object:myApp]; // This is inside my table view - where I'm loading the file data to display in table cells NSString *myPath = [self dataFilePath]; BOOL fileExists = [[NSFileManager defaultManager] fileExistsAtPath:myPath]; if (fileExists) { NSArray *values = [[NSArray alloc] initWithContentsOfFile:myPath]; for (int i = 0; i < values.count; i++) { cell.historyDisplay.text = [NSString stringWithFormat:@"%@", [values objectAtIndex:i]]; } } // This is the file path for history.plist - (NSString *)dataFilePath { NSArray *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); return [[path objectAtIndex:0] stringByAppendingString:@"history.plist"]; } // This is my search button - I want to save whatever was typed in the text field, into history.plist, to display in my tableview whenever a user goes to it. - (IBAction)saveHistory:(id)sender { NSMutableArray *values = [[NSMutableArray alloc]initWithContentsOfFile:[self dataFilePath]]; if(searchInputTextField.text.length > 0) [values addObject:searchInputTextField.text]; [values writeToFile:[self dataFilePath] atomically:YES]; [leTableView reloadData]; } 

Yo usaría mi sugerencia en los comentarios, pero aquí hay algunas ediciones de su código que podrían ayudar mientras tanto.

  NSArray *array = [[NSArray alloc] initWithContentsOfFile:filePath]; for (int i = 0; i <array.count; i++) { //I don't know what this line means UITextField *theField = self.searchHistory; //Change this line to this theField.text = [NSString stringWithFormat:@"%@", [array objectAtIndex:i]]; } 

Yo usaría Core Data, creando una class, es decir, HistoryRecord con los attributes termSearched y timestamp del tipo NSString y NSDate respectivamente.

 #import <Foundation/Foundation.h> #import <CoreData/CoreData.h> @interface HistoryRecordManagedObject : NSManagedObject @property (nonatomic, retain) NSString *termSearched; @property (nonatomic, retain) NSDate *timestamp; + (NSArray *)findEntity:(NSString *)entity withPnetworkingicate:(NSPnetworkingicate *)pnetworkingicate @end 

Implementación

 #import "HistoryRecordManagedObject.h" @implementation HistoryRecordManagedObject @dynamic termSearched; @dynamic timstamp; + (NSArray *)findEntity:(NSString *)entity withPnetworkingicate:(NSPnetworkingicate *)pnetworkingicate { NSError *error; NSArray *fetchedObjects; /* After set all properties, executes fetch request */ NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; NSEntityDescription *entityDesc = [NSEntityDescription entityForName:entity inManagedObjectContext:managedObjectContext]; [fetchRequest setEntity:entityDesc]; [fetchRequest setPnetworkingicate:pnetworkingicate]; fetchedObjects = [managedObjectContext executeFetchRequest:fetchRequest error:&error]; [fetchRequest release]; return fetchedObjects; } @end 

¡Por supuesto que no es solo esto! Hay algunas cosas adicionales que se deben hacer para usar Core Data, como crear el model. ¡Lee un poco sobre eso! ¡Merece la pena!

¡Buena suerte!

En la acción para search, simplemente guarde el resultado de la búsqueda en NSUserDefaults.

  NSMutableArray *searches = [[NSUserDefaults standardUserDefaults] arrayForKey:@"searches"]; [searches insertObject:textField.text atIndex:0]; [[NSUserDefaults standardUserDefaults] setObject:searches forKey:@"searches"]; [[NSUserDefaults standardUserDefaults] synchronize]; 

Luego cargue la misma matriz para el origen de datos de tablas y vuelva a cargar la tabla en viewwillappear y cuando se descarte el keyboard.

Reemplace su function saveHistory de la siguiente manera:

 - (IBAction)saveHistory:(id)sender { NSMutableArray *values = [[NSMutableArray alloc]initWithContentsOfFile:[self dataFilePath]]; if(searchInputTextField.text.length > 0) [values addObject:searchInputTextField.text]; [values writeToFile:[self dataFilePath] atomically:YES]; [leTableView reloadData]; } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return values.count; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @"Cell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (cell == nil) { cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier] autorelease]; } cell.textLabel.text = [values objectAtIndex:indexPath.row]; }