What I want:
Think about what
viewDidLoad means that the view controller has a view — but that view is not yet part of the interface.
viewWillAppear means that the view controller's view will become part of the interface — but hasn't yet.
viewDidAppear means that the view controller's view did become part of the interface.
You need your view to be part of the interface before your text field can summon the keyboard. Only then is the table view actually showing and configured. In other words, at this point the interface has settled down into its actual form, and we are ready to place the keyboard correctly above it.