I use the UITextViewDelegate and add a InputAccessoryView in textViewDidBeginEditing:
UITextViewDelegate
InputAccessoryView
textViewDidBeginEditing:
[textView setInputAccessoryView:done
I imagine when the code has reached textViewDidBeginEditing: that it is too late to make changes to the UI. Perhaps you can move your code to an earlier event, maybe textViewShouldBeginEditing:
textViewShouldBeginEditing: