views:

2694

answers:

5

Hi all,

I've been researching this for a few days now, and would appreciate a little help. Is there any way to generate a multi-line UITextField like Apple use in the SMS application? The useful thing about this control is that it has the 'sunk' appearance that makes it clear that it is a text entry box, but at the same time, it expands on each new-line character.

Failing that, if I'm forced to use a UITextView, can anyone advise how best to dismiss the keyboard ? Both the 'Done' and the 'Go' buttons just appear to generate newline characters ('\n'). This seems wrong to me - surely at least one of these should generate a different character, so that I can still allow for newline characters, but also dismiss my keyboard on a specific key press.

Am I missing something simple here ?

Thanks in advance :)

+2  A: 

Facebook has released an open-source package called Three20 that has a multi-line text field. You can use this pretty easily for an expanding text field.

As for the "Done" button, you can set your view controller as a UITextFieldDelegate. Then use this method:

 - (BOOL)textFieldShouldReturn:(UITextField *)textField {
     // Do whatever you want for your done button
      return YES;
 }

In the case of Three20, use this method of TTTextEditorDelegate:

 - (BOOL)textFieldShouldReturn:(TTTextEditor *)textField {
     // Do whatever you want for your done button
      return YES;
 }
Chris Long
Hi there...UITextView does not have a textViewShouldReturn method even when set as the UITextViewDelegate, so that does not work.I am also loathe to use the Three20 stuff as I have read reports of multiple applications being rejected from the app store because of the private APIs that Three20 uses.
Anonymouslemming
The private API references have long since been removed from Three20 (see the change list from 17 November 2009). As it was explained to me at the iPhone Tech Talk World Tour this past December, any code you end up not using gets stripped from release binaries anyway. See "Dead Code Stripping" in the Xcode Build System Guide (part of the iPhone OS Reference Library).
Joe D'Andrea
+1  A: 

Well, I had a similar problem, and what I ended up using is actually create a disabled UITextField as the background and a UITextView above it to get the input... It sucks that iPhone API cannot have this by default. Also note that this does not auto-expand, but you can do this if you want by handling the textViewDidChange:

As for handling the return key, try implementing the following method from the UITextViewDelegate:

- (void)textViewDidChange:(UITextView *)inTextView {
    NSString *text = inTextView.text;

    if ([text length] > 0 && [text characterAtIndex:[text length] -1] == '\n') {
        inTextView.text = [text substringToIndex:[text length] -1]; // remove last return from text view
        [inTextView resignFirstResponder]; // hide keyboard
    }
}
Adam Woś
Thanks for the advice on the UITextViewDelegate, but that won't work I'm afraid. As I want to allow multi-line input, I cannot scan for '\n' - this is why I felt the behaviour of 'Go' and 'Done' both generating \n is unhelpful.
Anonymouslemming
Well, the suggested solution (one I'm also using) would be to add a "Done" button to a `UINavigationBar` as the `UINavigationItem`'s `rightBarButtonItem`, and when it's clicked, just `resignFirstResponder` on your textview. Or, basically, just add any other element of the UI to resign the responder. The navigation bar seems widely used, though.
Adam Woś
A: 

Hey, little late but:

- (void)textEditorDidBeginEditing:(TTTextEditor *)textEditor {

And

- (void)textEditorDidEndEditing:(TTTextEditor *)textEditor {

might be what you're looking for. Enjoy!

Michael Thomas
+1  A: 

Maybe you can build upon a class I wrote? It's the same as tttexteditor, without the ugly glitches: http://www.hanspinckaers.com/multi-line-uitextview-similar-to-sms

HansPinckaers
+1  A: 

Sorry, a lot later but heres a REALLY GOOD TUTORIAL on exactly that:

http://www.hanspinckaers.com/multi-line-uitextview-similar-to-sms

John