iPhone에서 텍스트 입력 팝업 대화 상자를 얻는 간단한 방법


125

사용자 이름을 얻고 싶습니다. 간단한 텍스트 입력 대화 상자. 이 작업을 수행하는 간단한 방법이 있습니까?


1
9 월경까지 몇 달을 기다리면 인생이 훨씬 쉬워 질 것입니다.
조나단.

답변:


264

iOS 5에는 새롭고 쉬운 방법이 있습니다. 구현이 완전히 완료되었는지는 확실하지 않지만, 예를 들어 a UITableViewCell와 같이 유쾌하지는 않지만 현재 iOS API에서 표준으로 지원되므로 트릭을 반드시 수행해야합니다. 이를 위해 개인 API가 필요하지 않습니다.

UIAlertView * alert = [[UIAlertView alloc] initWithTitle:@"Alert" message:@"This is an example alert!" delegate:self cancelButtonTitle:@"Hide" otherButtonTitles:nil];
alert.alertViewStyle = UIAlertViewStylePlainTextInput;
[alert show];
[alert release];

그러면 다음과 같은 alertView가 렌더링됩니다 (XCode 4.2의 iPhone 5.0 시뮬레이터에서 가져온 스크린 샷).

alertViewStyle이 UIAlertViewStylePlainTextInput으로 설정된 경보 예

버튼을 누르면 일반 델리게이트 메소드가 호출되고 다음과 같이 textInput을 추출 할 수 있습니다.

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{ 
    NSLog(@"Entered: %@",[[alertView textFieldAtIndex:0] text]);
}

여기에 NSLog에 입력 한 결과 만 표시됩니다. 프로덕션 코드에서는 alertView에 대한 포인터를 전역 변수로 유지하거나 alertView 태그를 사용하여 델리게이트 함수가 적절하게 호출되었는지 확인 UIAlertView하지만이 예제에서는 괜찮습니다.

UIAlertView API를 확인해야 합니다 더 많은 스타일이 정의되어 있음을 알 수 있습니다.

이것이 도움이 되었기를 바랍니다!

-- 편집하다 --

나는 alertView를 약간 가지고 놀았고 원하는대로 textField를 편집하는 것이 완벽하게 가능하다는 발표가 필요 없다고 생각합니다.에 대한 참조를 만들고 UITextField정상적으로 프로그래밍 방식으로 편집 할 수 있습니다 . 이렇게하면 원래 질문에서 지정한대로 alertView를 구성했습니다. 결코 늦지 않은 것보다 낫다. :-)?

UIAlertView * alert = [[UIAlertView alloc] initWithTitle:@"Hello!" message:@"Please enter your name:" delegate:self cancelButtonTitle:@"Continue" otherButtonTitles:nil];
alert.alertViewStyle = UIAlertViewStylePlainTextInput;
UITextField * alertTextField = [alert textFieldAtIndex:0];
alertTextField.keyboardType = UIKeyboardTypeNumberPad;
alertTextField.placeholder = @"Enter your name";
[alert show];
[alert release];

이 경고가 생성됩니다.

UIAlertViewPlainTextInput alertStyle을 사용하여 사용자 이름을 묻는 UIAlertView

입력의 결과를 처리하기 위해 앞에서 포스터와 동일한 대리자 방법을 사용할 수 있습니다. UIAlertView그래도 해고를 막을 수 있는지 확실하지 않습니다 ( shouldDismissAFAIK 대리자 기능 은 없습니다 ). 사용자 입력이 유효하지 않은 경우 새 경고를 넣어야합니다 (또는 그냥 다시show ) 입력했습니다.

즐기세요!


1
Automatic Reference Counting을 사용하면 더 이상 개체를 유지하거나 해제하지 않아도됩니다.
Waqleh

5
알고 있지만이 답변은 2011 년에 작성되었습니다.
Warkst

3
이 방법은 IOS 9.0부터 감가 상각됩니다. 대신 UIAlertController를 사용하십시오 :
EckhardN

Swift 4 지원을 찾고 있다면 : stackoverflow.com/a/10689318/525576
John Riselvato

186

사용자가 텍스트를 입력 한 후 콜백을 받으려면 구성 핸들러 내에 대리자를 설정하십시오. textField.delegate = self

스위프트 3 & 4 (iOS 10-11) :

let alert = UIAlertController(title: "Alert", message: "Message", preferredStyle: UIAlertControllerStyle.alert)
alert.addAction(UIAlertAction(title: "Click", style: UIAlertActionStyle.default, handler: nil))
alert.addTextField(configurationHandler: {(textField: UITextField!) in
    textField.placeholder = "Enter text:"
    textField.isSecureTextEntry = true // for password input
})
self.present(alert, animated: true, completion: nil)

스위프트 (iOS 8-10)에서 :

여기에 이미지 설명을 입력하십시오

override func viewDidAppear(animated: Bool) {
    var alert = UIAlertController(title: "Alert", message: "Message", preferredStyle: UIAlertControllerStyle.Alert)
    alert.addAction(UIAlertAction(title: "Click", style: UIAlertActionStyle.Default, handler: nil))
    alert.addTextFieldWithConfigurationHandler({(textField: UITextField!) in
        textField.placeholder = "Enter text:"
        textField.secureTextEntry = true
        })
    self.presentViewController(alert, animated: true, completion: nil)
}

Objective-C (iOS 8)에서 :

- (void) viewDidLoad 
{
    UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"Alert" message:@"Message" preferredStyle:UIAlertControllerStyleAlert];
    [alert addAction:[UIAlertAction actionWithTitle:@"Click" style:UIAlertActionStyleDefault handler:nil]];
    [alert addTextFieldWithConfigurationHandler:^(UITextField *textField) {
        textField.placeholder = @"Enter text:";
        textField.secureTextEntry = YES;
    }];
    [self presentViewController:alert animated:YES completion:nil];
}

iOS 5-7의 경우 :

UIAlertView * alert = [[UIAlertView alloc] initWithTitle:@"Alert" message:@"INPUT BELOW" delegate:self cancelButtonTitle:@"Hide" otherButtonTitles:nil];
alert.alertViewStyle = UIAlertViewStylePlainTextInput;
[alert show];

여기에 이미지 설명을 입력하십시오


참고 : 아래는 iOS 7에서 작동하지 않습니다 (iOS 4-6 작동)

다른 버전을 추가하기 만하면됩니다.

UITextField를 가진 UIAlert

- (void)viewDidLoad{

    UIAlertView* alert = [[UIAlertView alloc] initWithTitle:@"Preset Saving..." message:@"Describe the Preset\n\n\n" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Ok", nil];
    UITextField *textField = [[UITextField alloc] init];
    [textField setBackgroundColor:[UIColor whiteColor]];
    textField.delegate = self;
    textField.borderStyle = UITextBorderStyleLine;
    textField.frame = CGRectMake(15, 75, 255, 30);
    textField.placeholder = @"Preset Name";
    textField.keyboardAppearance = UIKeyboardAppearanceAlert;
    [textField becomeFirstResponder];
    [alert addSubview:textField];

}

그런 다음 내가 [alert show];원할 때 전화 합니다.

따라가는 방법

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {         
    NSString* detailString = textField.text;
    NSLog(@"String is: %@", detailString); //Put it on the debugger
    if ([textField.text length] <= 0 || buttonIndex == 0){ 
        return; //If cancel or 0 length string the string doesn't matter
    }
    if (buttonIndex == 1) {
        ...

    }
}


1
IOS 4부터 이와 같은 것이 있었지만 OS 7에서는 깨지는 것 같습니다. 이제 Wakrst의 코드를 사용하십시오-많은 코드 줄을 저장하십시오.
Dave Appleton

그렇다면 iOS7에서 올바른 방법은 무엇입니까? 우리는 iOS6 SDK로 빌드하고 있지만 iOS7에서는 여전히 이상하게 보입니다.
sebrock

질문에 iOS7 지원 ​​추가
John Riselvato

1
alertView:(UIAlertView *) clickedButtonAtIndex:(NSInteger)buttonIndextextField.text의 값을 가져 오기 위해 델리게이트 메소드에 다음을 넣어야한다는 것을 알았습니다 .`NSString * theMessage = [alertView textFieldAtIndex : 0] .text;`
James Perih

1
Swift 코드에서 "var alert"를 "let alert"로 교체하여 최신 버전의 Swift
Matei Suica

11

Warkst의 세 번째 코드 스 니펫을 테스트했습니다. 숫자가 아닌 기본 입력 유형으로 변경 한 것을 제외하고는 훌륭했습니다.

UIAlertView * alert = [[UIAlertView alloc] initWithTitle:@"Hello!" message:@"Please enter your name:" delegate:self cancelButtonTitle:@"Continue" otherButtonTitles:nil];
alert.alertViewStyle = UIAlertViewStylePlainTextInput;
UITextField * alertTextField = [alert textFieldAtIndex:0];
alertTextField.keyboardType = UIKeyboardTypeDefault;
alertTextField.placeholder = @"Enter your name";
[alert show];

좋은 지적! 당시 textField가 엉망이었고 코드 스 니펫을 업로드하기 전에 키보드 유형을 변경하는 것을 잊었습니다. 내 코드가 기쁘다.
Warkst

11

iOS 9.0부터 UIAlertController를 사용하십시오.

UIAlertController* alert = [UIAlertController alertControllerWithTitle:@"My Alert"
                                                           message:@"This is an alert."
                                                          preferredStyle:UIAlertControllerStyleAlert];

UIAlertAction* defaultAction = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault
                                                  handler:^(UIAlertAction * action) {
                    //use alert.textFields[0].text
                                                       }];
UIAlertAction* cancelAction = [UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleDefault
                                                      handler:^(UIAlertAction * action) {
                                                          //cancel action
                                                      }];
[alert addTextFieldWithConfigurationHandler:^(UITextField * _Nonnull textField) {
    // A block for configuring the text field prior to displaying the alert
}];
[alert addAction:defaultAction];
[alert addAction:cancelAction];
[self presentViewController:alert animated:YES completion:nil];

5

답을 찾고있는 사람들이 이미 알고있을 것이라는 가정하에 아마도 제외되었다고 생각되는 중요한 정보를 추가하고 싶었습니다. 이 문제는 많이 발생하며 메시지 viewAlert버튼의 메소드 를 구현하려고 시도 할 때도 멈췄습니다 UIAlertView. 이렇게하려면 먼저 다음과 같은 델리게이트 클래스를 추가해야합니다.

@interface YourViewController : UIViewController <UIAlertViewDelegate>

또한 여기 에서 매우 유용한 자습서를 찾을 수 있습니다 !

도움이 되었기를 바랍니다.


5

이 스위프트 코드를 UIViewController에서 사용해보십시오-

func doAlertControllerDemo() {

    var inputTextField: UITextField?;

    let passwordPrompt = UIAlertController(title: "Enter Password", message: "You have selected to enter your passwod.", preferredStyle: UIAlertControllerStyle.Alert);

    passwordPrompt.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.Default, handler: { (action) -> Void in
        // Now do whatever you want with inputTextField (remember to unwrap the optional)

        let entryStr : String = (inputTextField?.text)! ;

        print("BOOM! I received '\(entryStr)'");

        self.doAlertViewDemo(); //do again!
    }));


    passwordPrompt.addAction(UIAlertAction(title: "Cancel", style: UIAlertActionStyle.Default, handler: { (action) -> Void in
        print("done");
    }));


    passwordPrompt.addTextFieldWithConfigurationHandler({(textField: UITextField!) in
        textField.placeholder = "Password"
        textField.secureTextEntry = false       /* true here for pswd entry */
        inputTextField = textField
    });


    self.presentViewController(passwordPrompt, animated: true, completion: nil);


    return;
}

3

스위프트 3 :

let alert = UIAlertController(title: "Alert", message: "Message", preferredStyle: UIAlertControllerStyle.alert)
alert.addAction(UIAlertAction(title: "Click", style: UIAlertActionStyle.default, handler: nil))
alert.addTextField(configurationHandler: {(textField: UITextField!) in
     textField.placeholder = "Enter text:"
})

self.present(alert, animated: true, completion: nil)

2

하위 뷰 UIAlertView와 함께 사용합니다 UITextField. 텍스트 필드를 수동으로 추가하거나 iOS 5에서 새로운 방법 중 하나를 사용할 수 있습니다.


다른 게시물에서 다음 코드를 추가했지만 팝업이 화면에 표시됩니다 (하단 절반 만 보이는 화면이 맨 위에 표시됨)
user605957

2
codeUIAlertView * myAlertView = [[UIAlertView alloc] initWithTitle : @ "제목이 여기에 있습니다"메시지 : @ "이것이 적용됩니다"delegate : self cancelButtonTitle : @ "취소"otherButtonTitles : @ "OK", nil]; UITextField * myTextField = [[UITextField alloc] initWithFrame : CGRectMake (12.0, 45.0, 260.0, 25.0)]; CGAffineTransform myTransform = CGAffineTransformMakeTranslation (0.0, 130.0); [myAlertView setTransform : myTransform]; [myTextField setBackgroundColor : [UIColor whiteColor]]; [myAlertView addSubview : myTextField]; [myAlertView 쇼]; [myAlertView 릴리스];
user605957

비슷한 코드를 시도하고 텍스트 상자와 버튼이있는 경고보기를 표시하지만 텍스트 필드를위한 공간이 충분하지 않아 제목과 버튼 사이에 붙어서 둘 다 만집니다. 프레임 크기를 조정하기 위해 일부 변형을 시도했지만 버튼은 원래 위치에 유지되므로 이동해야합니다. 버튼의 위치를 ​​바꾸는 방법을 모르며 프롬프트에서 사용자에게 단일 텍스트 줄을 검색하는 데 필요한 모든 것을 믿을 수 없습니다. 이것보다 더 좋은 방법이 없습니까?
딘 데이비드

2

같은 UIAlertView에 뷰를 추가 . iOS 5에는 몇 가지 "매직"기능이 있습니다 (하지만 NDA하에 있습니다).


나는 이것을 시도했고 그것은 다소 효과가있다. 팝업이 화면에서 제외 된 것을 제외하고 (팝업의 상단 절반이 잘립니다). 어떤 아이디어가 있습니까?
user605957

나는 같은 문제가 있었고, setTranformMakeTranslation (0,109)을 제거하면 ipad와 iphone 모두에서 나를 고쳤다. 그것없이 올바른 장소에 나타났습니다.

2

Xamarin 및 C #에서 :

var alert = new UIAlertView ("Your title", "Your description", null, "Cancel", new [] {"OK"});
alert.AlertViewStyle = UIAlertViewStyle.PlainTextInput;
alert.Clicked += (s, b) => {
    var title = alert.ButtonTitle(b.ButtonIndex);
    if (title == "OK") {
        var text = alert.GetTextField(0).Text;
        ...
    }
};

alert.Show();

0

John Riselvato의 답변을 기반으로 UIAlertView에서 문자열을 다시 검색합니다.

alert.addAction(UIAlertAction(title: "Submit", style: UIAlertAction.Style.default) { (action : UIAlertAction) in
            guard let message = alert.textFields?.first?.text else {
                return
            }
            // Text Field Response Handling Here
        })

-1
UIAlertview *alt = [[UIAlertView alloc]initWithTitle:@"\n\n\n" message:nil delegate:nil cancelButtonTitle:nil otherButtonTitles:@"OK", nil];

UILabel *lbl1 = [[UILabel alloc]initWithFrame:CGRectMake(25,17, 100, 30)];
lbl1.text=@"User Name";

UILabel *lbl2 = [[UILabel alloc]initWithFrame:CGRectMake(25, 60, 80, 30)];
lbl2.text = @"Password";

UITextField *username=[[UITextField alloc]initWithFrame:CGRectMake(130, 17, 130, 30)];
UITextField *password=[[UITextField alloc]initWithFrame:CGRectMake(130, 60, 130, 30)];

lbl1.textColor = [UIColor whiteColor];
lbl2.textColor = [UIColor whiteColor];

[lbl1 setBackgroundColor:[UIColor clearColor]];
[lbl2 setBackgroundColor:[UIColor clearColor]];

username.borderStyle = UITextBorderStyleRoundedRect;
password.borderStyle = UITextBorderStyleRoundedRect;

[alt addSubview:lbl1];
[alt addSubview:lbl2];
[alt addSubview:username];
[alt addSubview:password];

[alt show];
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.