UITextField в UIAlertView на iPhone - как сделать его отзывчивым? - PullRequest
24 голосов
/ 18 декабря 2008

Я поместил UITextField в UIAlertView и переместил его вверх, чтобы клавиатура не покрывала его следующим кодом:

[dialog setDelegate:self];
[dialog setTitle:@"Enter Name"];
[dialog addButtonWithTitle:@"Cancel"];
[dialog addButtonWithTitle:@"OK"];
UITextField * nameField = [[UITextField alloc] initWithFrame:CGRectMake(20.0, 45.0, 245.0, 25.0)];
[nameField setBackgroundColor:[UIColor whiteColor]];
[dialog addSubview:nameField];
CGAffineTransform moveUp = CGAffineTransformMakeTranslation(0.0, 100.0);
[dialog setTransform: moveUp];
[dialog show];

У меня также есть следующий код для просмотра предупреждений:

- (void) alertView:(UIAlertView *)alert clickedButtonAtIndex:(NSInteger)buttonIndex{    
    NSLog(@"%d", (int) buttonIndex);
    if (buttonIndex == 1) { // OK pushed
        NSLog([alert textField].text); // does not log anything
    } else {
        // Cancel pushed
}}

У меня также есть файл UIAlertViewExtended.h, который содержит:

@class UITextField, UILabel;

@interface UIAlertView(Extended)

-(UITextField *)textField;

@end

У меня вопрос: как получить текст, введенный пользователем, и как убрать клавиатуру?

Спасибо, Ben

Ответы [ 10 ]

49 голосов
/ 20 января 2012

Любой, кто поддерживает iOS 5.0 и более поздних версий с ARC, может установить следующее прямое свойство alertViewStyle:

-(void)showAlertWithTextField{
    UIAlertView* dialog = [[UIAlertView alloc] initWithTitle:@"Enter Name" message:@"" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Add", nil];    
    [dialog setAlertViewStyle:UIAlertViewStylePlainTextInput];

    // Change keyboard type
    [[dialog textFieldAtIndex:0] setKeyboardType:UIKeyboardTypeNumberPad];
    [dialog show];
}

-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{
    if (buttonIndex == 1)
        NSLog(@"%@",[[alertView textFieldAtIndex:0]text]);
}
31 голосов
/ 18 декабря 2008

Для тех, кого это волнует, вот рабочее решение:

UIAlertView* dialog = [[UIAlertView alloc] init];
[dialog setDelegate:self];
[dialog setTitle:@"Enter Name"];
[dialog setMessage:@" "];
[dialog addButtonWithTitle:@"Cancel"];
[dialog addButtonWithTitle:@"OK"];

nameField = [[UITextField alloc] initWithFrame:CGRectMake(20.0, 45.0, 245.0, 25.0)];
[nameField setBackgroundColor:[UIColor whiteColor]];
[dialog addSubview:nameField];
CGAffineTransform moveUp = CGAffineTransformMakeTranslation(0.0, 100.0);
[dialog setTransform: moveUp];
[dialog show];
[dialog release];
[nameField release];

Убедитесь, что вы создали UITextField * nameField; в вашем .h файле вы можете получить текст, введенный пользователем, выполнив: inputText = [nameField text];

в - (void) alertView: (UIAlertView *) предупреждение clickedButtonAtIndex: (NSInteger) метод buttonIndex.

важное примечание: для iOS 4.0+, CGAffineTransform выполняется автоматически, поэтому вы можете пропустить этот бит, если вы нацеливаетесь только на 4.0+. В противном случае вам нужно будет проверить, в какой ОС вы работаете, и соответственно обработать ее.

14 голосов
/ 09 февраля 2009

Стоит проверить

http://junecloud.com/journal/code/displaying-a-password-or-text-entry-prompt-on-the-iphone.html?cmd=success#comment3870

Для полного и комплексного решения.

6 голосов
/ 08 января 2009

Простой способ найти текстовое поле, не сохраняя явной ссылки на него, - установить его тег:

nameField.tag = ALERTVIEW_NAMEFIELD;

Убедитесь, что он отличается от 0 и от других UIView тегов объекта, которые вы можете иметь, включая родительский диалог!

Затем внутри обработчика alertView:clickedButtonAtIndex: вы можете получить свое текстовое поле следующим образом:

UITextField *nameField = (UITextField *)[alertView viewWithTag:ALERTVIEW_NAMEFIELD];
3 голосов
/ 11 декабря 2009

Нашли более понятное решение. Проверьте этот фрагмент кода: Имя пользователя и пароль UITextFields в приглашении UIAlertView

2 голосов
/ 14 апреля 2011

Проверьте эту реализацию: https://github.com/josecastillo/EGOTextFieldAlertView

1 голос
/ 18 июля 2012

Это для iOS5 и ARC.

-(void)showAlert {
    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"New Album" 
        message:@"Enter a name for the album." 
        delegate:self 
        cancelButtonTitle:@"Cancel" 
        otherButtonTitles:@"Save", nil];
    alertView.alertViewStyle = UIAlertViewStylePlainTextInput;

    UITextField* textfield = [alertView textFieldAtIndex:0];
    textfield.placeholder = @"Title";

    [alertView show];
}

-(void)alertView:(UIAlertView *)alertView 
    didDismissWithButtonIndex:(NSInteger)buttonIndex 
{
    if (buttonIndex != 1) {
        NSLog(@"Cancel");
        return;
    }
    UITextField* textfield = [alertView textFieldAtIndex:0];
    NSLog(@"Save. text: %@", textfield.text);
}
1 голос
/ 19 ноября 2009

Довольно хороший подход заключается в том, что вы можете использовать методы делегата UITextFieldDelegate для перемещения диалога вверх только тогда, когда клавиатура активирована. Смотри ниже.

- (void)textFieldDidBeginEditing:(UITextField *)textField {
    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:0.5]; 
    [UIView setAnimationDelegate:self];

    CGAffineTransform moveUp = CGAffineTransformMakeTranslation(0.0, -20);
    [dialog setTransform: moveUp];

    [UIView commitAnimations];
}

- (BOOL)textFieldShouldReturn:(UITextField *)textField {
    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:0.5]; 
    [UIView setAnimationDelegate:self];

    CGAffineTransform moveDown = CGAffineTransformMakeTranslation(0.0, 0.0);
    [dialog setTransform: moveDown];

    [textField resignFirstResponder];

    return YES;
}
0 голосов
/ 01 августа 2012

Хотел бы добавить одну незначительную поправку к ответу iWasRobbed:

GenericAlertDialogs.m:

+ (void)displayInputDialog:(NSString*)title delegate:(id<UIAlertViewDelegate>)delegate textFiled:(UITextField*)txtField
{
    UIAlertView* dialog = [[UIAlertView alloc] init];
    [dialog setDelegate:delegate];
    [dialog setTitle:title];
    [dialog setMessage:@" "];
    [dialog addButtonWithTitle:@"Cancel"];
    [dialog addButtonWithTitle:@"OK"];

    if(UIInterfaceOrientationIsPortrait([[UIApplication sharedApplication] statusBarOrientation]))
    {
        txtField.frame = CGRectMake(20.0, 45.0, 245.0, 25.0);
    }
    else 
    {
        txtField.frame = CGRectMake(20.0, 30.0, 245.0, 25.0);
    }

    [txtField becomeFirstResponder];
    [txtField setBackgroundColor:[UIColor whiteColor]];
    [dialog addSubview:txtField];
    [dialog show];   
}

Другой файл .m (реализует UIAlertViewDelegate)

 self->txtChangeName = [[UITextField alloc] init];
 [GenericAlertDialogs displayInputDialog:@"Some title...:" 
                                delegate:self 
                               textFiled:txtChangeName];

Обработка протокола UIAlertViewDelegate:

- (void) alertView:(UIAlertView *)alert clickedButtonAtIndex:(NSInteger)buttonIndex 
{
    if(buttonIndex == 1)
    {
        if([txtChangeName.text length] > 0)
        {
            self->userInput = [txtChangeName text];
         }
     }
     self->txtChangeName = nil;
}

Совместимость с iOS 4+.

0 голосов
/ 20 января 2012

Это всего лишь еще одна строка обычного кода UIAlertView. Надеюсь, это поможет!

    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"test" message:@"This is a alert with a textfield" delegate:self cancelButtonTitle:@"YAY" otherButtonTitles:nil];
    alert.alertViewStyle = UIAlertViewStylePlainTextInput;
    [alert show];
    [alert release];

работает только на iOS 5 или более поздней версии

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...