J'essaie de créer une interface utilisateur afin que l'utilisateur puisse modifier les attributs d'une entité de données principale. Lorsque l'utilisateur appuie sur le bouton d'édition, la sélection d'une ligne va appuyer sur listDetailViewController
, qui est juste une vue de table qui affiche les attributs. Il utilise une cellule de vue de table personnalisée avec une étiquette et un UITextField. Le listDetailViewController
affiche les attributs correctement, et acceptera le texte comme il est censé le faire, mais je ne peux pas comprendre comment obtenir le texte saisi par l'utilisateur à enregistrer.Impossible d'enregistrer les modifications apportées aux attributs de données de base
Si je ne m'explique pas clairement, voici un exemple. Je veux changer le nom de la liste, donc je tape Modifier, touchez la liste, appuyez sur la ligne Nom de la liste, le clavier apparaît, je tape le nouveau nom, appuyez sur Terminé et il me renvoie à la RVC sans aucun des changements enregistré. Je me suis cogné la tête pendant quelques jours et j'adorerais de l'aide!
Voici le code correspondant de ListDetailViewController
:
- (void)viewDidLoad {
[super viewDidLoad];
UIBarButtonItem *doneButton = [[UIBarButtonItem alloc]
initWithBarButtonSystemItem:UIBarButtonSystemItemDone
target:self
action:@selector(done)];
self.navigationItem.rightBarButtonItem = doneButton;
[doneButton release];
self.tableView.allowsSelection = NO;
self.tableView.allowsSelectionDuringEditing = NO;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
// Return the number of rows in the section.
return 3;
}
// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *DetailCellIdentifier = @"DetailCell";
ListDetailCell *cell = (ListDetailCell *)[tableView dequeueReusableCellWithIdentifier:DetailCellIdentifier];
if (cell == nil) {
[[NSBundle mainBundle] loadNibNamed:@"ListDetailCell" owner:self options:nil];
cell = listDetailCell;
self.listDetailCell = nil;
// Configure the cell...
// list name
if (0 == indexPath.row) {
cell.label.text = @"List Name";
cell.textField.text = self.selectedList.listName;
cell.textField.placeholder = @"Name";
}
// Detail 1
if (1 == indexPath.row) {
cell.label.text = @"Detail 1";
cell.textField.text = selectedList.detail1;
cell.textField.placeholder = @"Detail 1";
}
// Detail 2
if (2 == indexPath.row) {
cell.label.text = @"Detail 2";
cell.textField.text = selectedList.detail2;
cell.textField.placeholder = @"Detail 2";
}
}
return cell;
}
- (void)done {
[self.listDetailCell resignFirstResponder];
[self.navigationController popViewControllerAnimated:YES];
}
Les Ivars label
et textField
sont déclarés dans ListDetailCell
, qui est la pointe de la cellule de tableau je l'ai mentionné plus tôt.
Dois-je ajouter le délégué à la classe de cellule ou à la méthode 'cellForRowAtIndexPath'? Et le clavier n'est pas un problème, puisque le bouton Terminé et le contrôleur de navigation fonctionnent comme ils sont supposés le faire. J'ai modifié mon exemple pour plus de clarté afin d'être plus clair! –
J'ai mis à jour ci-dessus pour inclure un exemple de code. Méfiez-vous des fautes de frappe, je l'ai tapé à la main :-) – drekka
Cela l'a fait, merci! J'enveloppe toujours mon cerveau autour des délégués, et chaque nouveau bit aide. :) –