Pour un projet que je travaillais sur, nous avions un champ de texte que les utilisateurs ont tendance à entrer dans la même poignée de valeurs de plus et plus. En effet, le fait qu'ils avaient à garder en entrant les valeurs mêmes et plus était assez frustrant de nos testeurs. Mais nous ne pouvions pas fournir une liste définie, car elle ne serait pas les mêmes valeurs pour tous les utilisateurs. Ils avaient besoin de la souplesse nécessaire pour ajouter une valeur quelconque dont ils avaient besoin, mais je voulais la commodité de ne pas avoir à entrer ceux qu'ils avaient déjà entrés. Sur une application de bureau, la réponse aurait probablement été un combo-box, ou un champ texte avec saisie prédictive qui permettrait à l'utilisateur de taper quelques caractères de la valeur et puis appuyez sur l'onglet ou le retour pour le sélectionner.
L'iPhone ne dispose pas de listes déroulantes, et le type vert serait une douleur pour mettre en œuvre et j'avais des inquiétudes qu'il pourrait obtenir sonné dans le processus d'examen (oui, Apple, votre revue les politiques sont certainement avoir un effet paralysant). La réponse je suis venu avec pour gérer cette situation était de créer un contrôleur de sélection modifiable liste. Il fonctionne exactement comme la Generic Controller liste de sélection J'ai posté il ya une semaine, sauf qu'il punaises d'un élément sur l'extrémité de la table pour permettre à l'utilisateur d'ajouter un nouvel élément à la liste:

Lorsque vous sélectionnez ce dernier élément, il utilise le Multiple Text Field Editing Controller d'inviter l'utilisateur à la nouvelle valeur:

À un certain point, je tiens à refactoriser cette classe, et le SelectionListViewcontroller dans une classe, comme il ya beaucoup de points communs entre eux, mais pour l'instant, c'est une catégorie distincte. Vous devez avoir la classe dans votre projet TextFieldEditingViewcontroller aussi, car il utilise que pour laisser l'utilisateur saisir de nouvelles valeurs.
EditableSelectionListViewController.h
EditableSelectionListViewController.m
L'iPhone ne dispose pas de listes déroulantes, et le type vert serait une douleur pour mettre en œuvre et j'avais des inquiétudes qu'il pourrait obtenir sonné dans le processus d'examen (oui, Apple, votre revue les politiques sont certainement avoir un effet paralysant). La réponse je suis venu avec pour gérer cette situation était de créer un contrôleur de sélection modifiable liste. Il fonctionne exactement comme la Generic Controller liste de sélection J'ai posté il ya une semaine, sauf qu'il punaises d'un élément sur l'extrémité de la table pour permettre à l'utilisateur d'ajouter un nouvel élément à la liste:
Lorsque vous sélectionnez ce dernier élément, il utilise le Multiple Text Field Editing Controller d'inviter l'utilisateur à la nouvelle valeur:
À un certain point, je tiens à refactoriser cette classe, et le SelectionListViewcontroller dans une classe, comme il ya beaucoup de points communs entre eux, mais pour l'instant, c'est une catégorie distincte. Vous devez avoir la classe dans votre projet TextFieldEditingViewcontroller aussi, car il utilise que pour laisser l'utilisateur saisir de nouvelles valeurs.
EditableSelectionListViewController.h
//
// SelectionListViewController.h
//
// Created by Jeff LaMarche on 2/18/09.
// Copyright 2009 Jeff LaMarche Consulting. All rights reserved.
//
#import <UIKit/UIKit.h>
#import "AbstractGenericViewController.h"
#import "TextFieldEditingViewController.h"
@protocol EditableSelectionListViewControllerDelegate <NSObject>
@required
- (void)rowChosen:(NSInteger)row fromArray:(NSMutableArray *)theList;
@end
@interface EditableSelectionListViewController : AbstractGenericViewController <TextFieldEditingViewControllerDelegate>
{
NSMutableArray *list;
NSIndexPath *lastIndexPath;
NSInteger initialSelection;
id <EditableSelectionListViewControllerDelegate> delegate;
}
@property (nonatomic, retain) NSIndexPath *lastIndexPath;
@property (nonatomic, retain) NSArray *list;
@property NSInteger initialSelection;
@property (nonatomic, assign) id <EditableSelectionListViewControllerDelegate> delegate;
@end
EditableSelectionListViewController.m
//
// SelectionListViewController.m
//
// Created by Jeff LaMarche on 2/18/09.
// Copyright 2009 Jeff LaMarche Consulting. All rights reserved.
//
#import "EditableSelectionListViewController.h"
@implementation EditableSelectionListViewController
@synthesize list;
@synthesize lastIndexPath;
@synthesize initialSelection;
@synthesize delegate;
-(IBAction)save
{
[self.delegate rowChosen:[lastIndexPath row] fromArray:list];
[self.navigationController popViewControllerAnimated:YES];
}
#pragma mark -
- (id)initWithStyle:(UITableViewStyle)style
{
initialSelection = -1;
return self;
}
- (void)viewWillAppear:(BOOL)animated
{
// Check to see if user has indicated a row to be selected, and set it
if (initialSelection > - 1 && initialSelection < [list count])
{
NSUInteger newIndex[] = {0, initialSelection};
NSIndexPath *newPath = [[NSIndexPath alloc] initWithIndexes:newIndex length:2];
self.lastIndexPath = newPath;
[newPath release];
}
[super viewWillAppear:animated];
}
- (void)dealloc
{
[list release];
[lastIndexPath release];
[super dealloc];
}
#pragma mark -
#pragma mark Tableview methods
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return [list count] + 1;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *SelectionListCellIdentifier = @"SelectionListCellIdentifier";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:SelectionListCellIdentifier];
if (cell == nil)
{
cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:SelectionListCellIdentifier] autorelease];
}
NSUInteger row = [indexPath row];
NSUInteger oldRow = [lastIndexPath row];
if (row >= [list count])
{
cell.font = [UIFont boldSystemFontOfSize:19.0];
cell.text = NSLocalizedString(@"Other...", @"Other...");
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
}
else
{
cell.font = [UIFont systemFontOfSize:19.0];
cell.text = [list objectAtIndex:row];
cell.accessoryType = (row == oldRow && lastIndexPath != nil) ? UITableViewCellAccessoryCheckmark : UITableViewCellAccessoryNone;
}
return cell;
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
int newRow = [indexPath row];
int oldRow = [lastIndexPath row];
if (newRow < [list count])
{
if (newRow != oldRow)
{
UITableViewCell *newCell = [tableView cellForRowAtIndexPath:indexPath];
newCell.accessoryType = UITableViewCellAccessoryCheckmark;
UITableViewCell *oldCell = [tableView cellForRowAtIndexPath: lastIndexPath];
oldCell.accessoryType = UITableViewCellAccessoryNone;
lastIndexPath = indexPath;
}
}
else
{
TextFieldEditingViewController *controller = [[TextFieldEditingViewController alloc] initWithStyle:UITableViewStyleGrouped];
controller.fieldKeys = [NSArray arrayWithObject:@"newValue"];
controller.fieldNames = [NSArray arrayWithObject:NSLocalizedString(@"New Item", @"New Item")];
controller.fieldValues = [NSArray arrayWithObject:@""];
controller.delegate = self;
[self.navigationController pushViewController:controller animated:YES];
}
[tableView deselectRowAtIndexPath:indexPath animated:YES];
}
#pragma mark -
- (void)selectRow:(NSIndexPath *)theIndexPath
{
//[self.tableView selectRowAtIndexPath:theIndexPath animated:YES scrollPosition:UITableViewScrollPositionBottom];
[self tableView:self.tableView didSelectRowAtIndexPath:theIndexPath];
}
- (void)valuesDidChange:(NSDictionary *)newValues
{
NSString *newVal = [newValues objectForKey:@"newValue"];
[list addObject:newVal];
//[self.tableView reloadData];
[list sortUsingSelector:@selector(compare:)];
NSUInteger theIndices[] = {0, [list indexOfObject:newVal]};
NSIndexPath *theIndexPath = [[NSIndexPath alloc] initWithIndexes:theIndices length:2];
[self performSelector:@selector(selectRow:) withObject:theIndexPath afterDelay:0.05];
// [self tableView:self.tableView didSelectRowAtIndexPath:theIndexPath];
[self.tableView reloadData];
}
@end
Aucun commentaire:
Enregistrer un commentaire