2010-04-17 7 views
17

J'ai une application de données de base qui utilise un contrôleur de navigation pour afficher en détail une vue détaillée. Si vous modifiez l'une des lignes de données dans la vue détaillée, vous passez à une vue d'édition pour cette seule ligne. Exemple AppleData CoreDataBooks (sauf CoreDataBooks utilise uniquement un UITextField seul, pas un qui est une sous-vue de UITableViewCell comme le mien)!Sous-vue UITextField de UITableViewCell pour devenir le premier répondeur?

La vue d'édition est un UITableviewController qui crée sa table avec une seule section à une seule ligne et un UITextfield dans la cellule, par programmation. Ce que je veux faire est quand vous sélectionnez une ligne à éditer et la vue d'édition est poussée sur la pile de nav et la vue d'édition est animée se déplaçant à travers l'écran, je veux que le champ de texte soit choisi comme firstResponder afin que le le clavier est déjà affiché lorsque la vue se déplace sur l'écran pour prendre position. Comme dans l'application Contacts ou dans l'application CoreDataBooks.

J'ai actuellement le code suivant dans mon application qui provoque la vue de charger et vous voyez apparaître le clavier (qui est pas ce que je veux, je veux que le clavier est déjà là)

- (void)viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 
    [theTextField becomeFirstResponder]; 
} 

Vous ne pouvez pas le mettre dans -viewWillAppear car le champ de texte n'a pas encore été créé, donc theTextField est nul. Dans l'application CoreDataBooks où ils obtiennent ce que je veux, ils chargent leur vue à partir d'une plume afin qu'ils utilisent le même code mais dans -viewWillAppear car le champ de texte a déjà été créé!

Y at-il moyen de contourner cela sans créer une plume, je veux garder l'implémentation programmatique pour permettre une plus grande flexibilité.

Merci beaucoup

Répondre

15

Après avoir parlé avec l'équipe de soutien Apple Dev, j'ai une réponse!

Ce que vous devez faire est de créer un UITextField offscreen dans -(void)loadView; puis définissez comme premier intervenant alors sur la méthode viewDidLoad vous pouvez définir le UITextField dans le UITableViewCell être le premier répondeur. Heres quelques exemples de code (rappelez-vous que je fais cela dans un UITableViewController donc je suis en train de créer le tableview aussi!

- (void)loadView 
{ 
    [super loadView]; 

    //Set the view up. 
    UIView *theView = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 
    self.view = theView; 
    [theView release]; 

    //Create an negatively sized or offscreen textfield 
    UITextField *hiddenField = [[UITextField alloc] initWithFrame:CGRectMake(0, 0, -10, -10)]; 
    hiddenTextField = hiddenField; 
    [self.view addSubview:hiddenTextField]; 
    [hiddenField release]; 

    //Create the tableview 
    UITableView *theTableView = [[UITableView alloc] initWithFrame:[[UIScreen mainScreen] bounds] style:UITableViewStyleGrouped]; 
    theTableView.delegate = self; 
    theTableView.dataSource = self; 
    [self.view addSubview:theTableView]; 
    [theTableView release]; 

    //Set the hiddenTextField to become first responder 
    [hiddenTextField becomeFirstResponder]; 

    //Background for a grouped tableview 
    self.view.backgroundColor = [UIColor groupTableViewBackgroundColor]; 
} 

- (void)viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 
    //Now the the UITableViewCells UITextField has loaded you can set that as first responder 
    [theTextField becomeFirstResponder]; 
} 

J'espère que cela aide les personnes coincées dans la même position que moi!

Si quelqu'un d'autre peut voir une meilleure façon de le faire s'il vous plaît dire

+3

J'ai lutté avec cela pendant plus d'un an. Parfois, j'obtiendrais une solution qui fonctionnerait, mais une nouvelle mise à jour d'iOS la casserait. Si ennuyant. C'est la meilleure solution que j'ai vu à ce jour, malgré tout ce que ça fait. –

+0

Merci pour ce super bidouillage mais je ne comprends pas pourquoi nous avons besoin de 'hiddenTextField'? Do 'hiddenTextField' et 'theTextField' pointent vers la même instance UITextField? –

+0

lorsque vous utilisez ce "hack", pouvez-vous voir le curseur? J'ai essayé avec uitableviewcell personnalisé avec une uitextview: le clavier s'ouvre mais il n'y a pas de focus sur uitextview. – Sefran2

3

Je pense que la solution évidente est de créer le champ de texte dans la méthode init du contrôleur de vue. C'est généralement là que vous configurez la vue, car un contrôleur de vue nécessite une propriété d'affichage remplie.

Ensuite, vous pouvez définir le champ de texte comme premier intervenant dans viewWillAppear et le clavier doivent être visibles que les diapositives de vue en

+0

Je crée actuellement l'UITextField dans - (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath avec la cellule. J'ai initialisé le UITextField dans la méthode init et en mettant en fonctionnement viewFirstResponder dans viewWillApper, mais le clavier ne glissait toujours pas, il est apparu juste après que la vue se soit glissée. Lequel je ne comprends pas!?! –

+0

Non, vous devez créer un nouveau texte dans la vue détaillée et le définir en tant que premier répondeur. Si vous définissez cela avant que la vue n'apparaisse, elle devrait apparaître avec le clavier déjà affiché. Vous ne pouvez pas transférer le premier répondeur d'une vue à une autre vue poussée sur la pile de navigation. Le premier répondeur de la table n'aura aucun effet sur le premier répondeur de la vue nav quelle que soit la façon dont il apparaît à l'utilisateur. – TechZen

+0

La vue détaillée est la vue que l'utilisateur est en train de regarder avant d'appuyer sur une rangée pour l'amener à la vue d'édition qui contient le champ de texte. Je ne suis pas sûr si je comprends comment mettre un textfield avec premier répondeur sur une vue qui est sur le point de "disparaître" fera apparaître un clavier sur la vue sur le point de "apparaître"? La raison pour laquelle cela ne fonctionne pas est que la vue de table n'est créée que lorsque la vue apparaît. Vous ne pouvez donc pas sélectionner le premier répondeur dans le champ de texte actuel avant que la vue ne soit créée. ! Mais alors Apple semble le faire dans l'application Contacts un peu comment –

2

avez-vous essayé d'utiliser les méthodes de délégué de UINavigationController ?:

NavigationController:. WillShowViewController: animation :

+0

Salut remover merci pour votre réponse! Je viens de l'essayer et ça n'a pas fonctionné à nouveau UITextField est nul au moment où navigationController: willShowViewController: animé: s'appelle je crois pour les mêmes raisons que ci-dessus. À moins qu'il n'y ait loin de créer le champ de texte dans la table avant que la vue ne soit chargée, je suppose que le seul moyen doit être de le faire à partir d'une plume! –

5

Essayez le faire dans la méthode viewDidAppear, fonctionne pour moi.

Questions connexes