2010-04-17 8 views
17

Possiedo un'applicazione di dati di base che utilizza un controller di navigazione per eseguire il drill-down su una vista di dettaglio e quindi se si modifica una delle righe di dati nella vista di dettaglio si passa a una visualizzazione di modifica per quella linea singola, come in Esempio di mele CoreDataBooks (eccetto CoreDataBooks utilizza solo un UITextField da solo, non uno che è una sottoview di UITableViewCell come il mio)!Sottotitoli UITextField di UITableViewCell per diventare il primo soccorritore?

La vista di modifica è una UITableviewController che crea la sua tabella con una singola sezione singola riga e una UITextfield nella cella, in modo programmatico.

Quello che voglio che accada è quando si seleziona una riga da modificare e la vista edit viene inserito nello stack nav e la vista di modifica è animato in movimento attraverso lo schermo, voglio che il campo di testo per essere selezionato come firstResponder in modo che il la tastiera è già visualizzata mentre la vista si sposta sullo schermo per assumere la posizione. Come nell'app Contatti o nell'app CoreDataBooks.

ho attualmente il seguente codice nella mia app che fa sì che la vista da caricare e poi si vede la tastiera appare (che non è quello che voglio, voglio la tastiera per essere già lì)

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

Non è possibile inserirlo in -viewWillAppear poiché il campo di testo non è ancora stato creato, quindi theTextField è nullo. Nell'app CoreDataBooks dove ottengono ciò che voglio caricano la loro vista da un pennino in modo che usino lo stesso codice ma in -viewWillAppear come il campo di testo è già stato creato!

C'è comunque un modo per aggirare questo senza creare un pennino, voglio mantenere l'implementazione programmatica per consentire una maggiore flessibilità.

Molte grazie

risposta

15

Dopo aver parlato con l'Apple Dev Support Team, ho una risposta!

Quello che dovete fare è di creare un fuori campo UITextField in -(void)loadView; e poi impostarlo come first responder poi sul metodo viewDidLoad è possibile impostare il UITextField nella UITableViewCell essere il primo responder. Ecco qualche esempio di codice (ricordate che sto facendo questo in un UITableViewController così sto creando tableView pure!

- (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]; 
} 

Spero che questo aiuta chiunque bloccato nella stessa posizione di me!

Se qualcun altro puoi vedere un modo migliore per farlo, per favore, per esempio:

+3

Ho combattuto con questo per oltre un anno. A volte avrei trovato una soluzione che avrebbe funzionato, ma poi un nuovo aggiornamento per iOS avrebbe rotto. Così fastidioso. Questa è la soluzione migliore che abbia mai visto fino ad oggi, nonostante la sensazione di hacky. –

+0

Grazie per questo grande trucco, ma non capisco perché abbiamo bisogno di "hiddenTextField"? I punti "hiddenTextField" e "theTextField" si riferiscono alla stessa istanza di UITextField? –

+0

quando usi questo "hack", puoi vedere il cursore? Ho provato con uitableviewcell personalizzata con uitextview in essa: la tastiera si apre ma non ci si concentra su uitextview. – Sefran2

3

penso che la soluzione più ovvia è quella di creare il campo di testo nel metodo del controller della vista init. Di solito è dove si configura la vista perché un controller di visualizzazione richiede una proprietà di visualizzazione popolata.

Quindi è possibile impostare il campo di testo come first responder in viewWillAppear e la tastiera dovrebbe essere visibile come le diapositive vista in

+0

Attualmente creo UITextField in - (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath insieme alla cella. Ho inizializzato l'UITextField nel metodo init e ho inserito getFirstResponder in viewWillApper, ma la tastiera non l'ha ancora fatto scorrere solo quando è stata visualizzata la vista. Che non riesco a capire!?! –

+0

No, è necessario creare un nuovo testo archiviato nella vista dettagli e impostarlo come primo risponditore. Se lo si imposta prima che la vista sia effettivamente visualizzata, dovrebbe apparire con la tastiera già in vista. Non è possibile trasferire il primo risponditore di una vista a un'altra vista inserita nella pila di navigazione. Il primo risponditore della tabella non avrà alcun effetto sul primo risponditore della vista nav indipendentemente da come appare all'utente. – TechZen

+0

La vista dettagli è la vista che l'utente sta attualmente esaminando prima di toccare una riga per portarli alla vista di modifica su cui è presente il campo di testo. Non sono sicuro se capisco come mettere un campo di testo con firstresponder su una vista che sta per "sparire" farà apparire una tastiera sulla vista che sta per "apparire"? Il motivo per cui penso che questo non funzioni è perché la vista tabella non viene creata fino a quando non viene visualizzata la vista, quindi non è possibile selezionare il primo risponditore nel campo di testo corrente prima che la vista arrivi perché non è stata ancora creata ! Ma poi Apple sembra farlo nell'app Contatti, un po 'come –

2

Hai provato a usare i metodi delegato UINavigationController ?:

navigationController:. WillShowViewController: animato :

+0

Ciao remover grazie per la tua risposta! Ho appena provato e non ha funzionato di nuovo UITextField è nil al momento quale navigationController: willShowViewController: animato: è chiamato Credo per gli stessi motivi di cui sopra. A meno che non ci sia la possibilità di creare il campo di testo nella tabella prima che la vista venga caricata, suppongo che l'unico modo per farlo sia farlo da un pennino! –

5

Provalo nel metodo viewDidAppear, funziona per me.