İPhone'da metin girişi açılır iletişim kutusu almanın basit bir yolu nedir?


125

Kullanıcı adını almak istiyorum. Basit bir metin girişi iletişim kutusu. Bunu yapmanın basit bir yolu var mı?


1
Eylül ayına kadar birkaç ay bekle, hayatın çok daha kolay olacak.
Jonathan.

Yanıtlar:


264

İOS 5'te bunun yeni ve kolay bir yolu var. Uygulamanın henüz tam olarak tamamlanıp tamamlanmadığından emin değilim, çünkü diyelim ki a kadar zarif değil UITableViewCell, ancak şimdi iOS API'de standart olarak desteklendiği için kesinlikle hile yapmalı. Bunun için özel bir API'ye ihtiyacınız olmayacak.

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];

Bu, şu şekilde bir alertView oluşturur (XCode 4.2'deki iPhone 5.0 simülatöründen alınan ekran görüntüsü):

alertViewStyle öğesi UIAlertViewStylePlainTextInput olarak ayarlanmış örnek uyarı

Herhangi bir düğmeye bastığınızda, normal temsilci yöntemleri çağrılır ve textInput'u aşağıdaki gibi çıkarabilirsiniz:

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

Burada sadece girilen sonuçları NSLog olarak kaydediyorum. Üretim kodunda, büyük olasılıkla bir global değişken olarak alertView'unuza bir işaretçi tutmalısınız veya delege fonksiyonunun uygun tarafından çağrılıp çağrılmadığını kontrol etmek için alertView etiketini kullanmalısınız, UIAlertViewancak bu örnek için bu tamam olmalıdır.

UIAlertView API'yi kontrol etmelisiniz ve tanımlanmış daha fazla stil olduğunu göreceksiniz.

Umarım bu yardımcı olmuştur!

-- DÜZENLE --

Biraz alertView ile oynuyordum ve textField'i istediğiniz gibi düzenlemenin mükemmel bir şekilde mümkün olduğuna dair bir duyuruya gerek olmadığını düşünüyorum: için bir referans oluşturabilir UITextFieldve onu normal şekilde düzenleyebilirsiniz (programlı olarak). Bunu yaparak, orijinal sorunuzda belirttiğiniz gibi bir alertView oluşturdum. Geç olması hiç olmamasından iyidir, değil mi :-)?

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];

Bu, şu uyarıyı üretir:

Bir kullanıcı adı sormak için UIAlertViewPlainTextInput alertStyle kullanan UIAlertView

Girişten gelen sonucu işlemek için daha önce gönderdiğim temsilci yöntemini kullanabilirsiniz. Eğer önleyebilir olmadığından emin değilim UIAlertViewgerçi işten çıkarması (hayır yoktur shouldDismissben kullanıcı girişi geçersiz ise, yeni bir uyarı katlanmak zorunda (ya da sadece yeniden varsayalım böylece temsilci fonksiyonu AFAIK) showdoğru giriş olana kadar bu bir) girdi.

İyi eğlenceler!


1
Otomatik Referans Sayma ile artık nesneleri kendi başınıza tutup bırakmanız gerekmiyor.
Waqleh

5
Biliyorum, ama bu cevap 2011'de yazılmıştır.
Warkst

3
Yöntem, IOS 9.0'dan beri amortismana tabi tutulmuştur. Bunun yerine UIAlertController'ı kullanın:
EckhardN

Swift 4 ile destek arıyorsanız: stackoverflow.com/a/10689318/525576
John Riselvato

186

Kullanıcı metni girdikten sonra geri aramaları aldığınızdan emin olmak için, temsilciyi yapılandırma işleyicisinin içinde ayarlayın. textField.delegate = self

Swift 3 ve 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)

Swift'de (iOS 8-10):

görüntü açıklamasını buraya girin

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'de (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];
}

İOS 5-7 İÇİN:

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

görüntü açıklamasını buraya girin


NOT: Aşağıdaki iOS 7 ile çalışmaz (iOS 4-6 Çalışır)

Sadece başka bir versiyon eklemek için.

UITextField ile 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];

}

sonra [alert show];istediğim zaman ararım .

Birlikte giden yöntem

- (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'ten beri buna benzer bir şeyim vardı ama OS 7'de kırılıyor gibi görünüyor Şimdi Wakrst kodunu kullanın - birçok kod satırını kaydedin.
Dave Appleton

Peki, iOS7 için bunu yapmanın doğru yolu nedir? İOS6 SDK ile oluşturuyoruz ancak iOS7'de hala tuhaf görünüyor.
sebrock

Soruya iOS7 desteği eklendi
John Riselvato

1
Bulunan alertView:(UIAlertView *) clickedButtonAtIndex:(NSInteger)buttonIndextextField.text değerini almak için temsilci yöntemime aşağıdakileri koymak zorunda kaldım : `NSString * theMessage = [alertView textFieldAtIndex: 0] .text;"
James Perih


11

Warkst'ın üçüncü kod parçacığını test etti - harika çalıştı, ancak onu sayısal yerine varsayılan giriş türü olarak değiştirdim:

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];

İyi bir nokta! O sırada textField ile uğraşıyordum ve kod parçacığını yüklemeden önce klavye türünü değiştirmeyi unuttum. Kodumun size yardımcı olabileceğine sevindim!
Warkst

11

IOS 9.0 UIAlertController'ı kullandığından beri:

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

Belki de cevap arayanların zaten bildiği varsayımıyla dışarıda bırakıldığına inandığım önemli bir bilgi parçası eklemek istedim. Bu sorun çok oluyor ve ben de mesajın viewAlertdüğmeleri için yöntemi uygulamaya çalıştığımda kendimi sıkışmış buldum UIAlertView. Bunu yapmak için önce aşağıdaki gibi görünebilecek delege sınıfını eklemeniz gerekir:

@interface YourViewController : UIViewController <UIAlertViewDelegate>

Ayrıca burada çok faydalı bir öğretici bulabilirsiniz !

Bu yardımcı olur umarım.


5

Bu Swift kodunu bir UIViewController'da deneyin -

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

Swift 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

Bir alt görünümü UIAlertViewolan a UITextFieldkullanırdım. Metin alanını manuel olarak ekleyebilir veya iOS 5'te yeni yöntemlerden birini kullanabilirsiniz.


Aşağıdaki kodu başka bir
gönderiden ekledim

2
codeUIAlertView * myAlertView = [[UIAlertView tahsisi] initWithTitle: @ "Başlığınız burada" mesaj: @ "bu kapsanacak" temsilci: self cancelButtonTitle: @ "İptal" otherButtonTitles: @ "Tamam", nil]; UITextField * myTextField = [[UITextField ayırma] 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 gösterisi]; [myAlertView sürümü];
user605957

Benzer kodu denedim ve metin kutusu ve düğmelerle uyarı görünümünü gösteriyor ancak metin alanı için yeterli yer yok, başlık ve düğmeler arasında sıkışmış ve ikisine de dokunuyor. Çerçeveyi ölçeklemek için bazı dönüşümler denedim, ancak düğmeler oldukları yerde kalıyor, bu yüzden de taşınmaları gerekiyor. Düğmeleri nasıl yeniden konumlandıracağımı bilmiyorum ve tüm bunların bir komut isteminden kullanıcıya tek bir metin satırı almak için gerekli olduğuna inanamıyorum. Bundan daha iyi bir yolu yok mu?
Dean Davids

2

Böyle bir UIAlertView manzarasına ekleyin bu . İOS 5'te bunu sizin için yapan bazı "sihirli" şeyler var (ama hepsi Gizlilik Sözleşmesi kapsamında).


Bunu denedim ve biraz işe yarıyor. Pop-up'ın ekran dışında olması dışında (pop-up'ın üst yarısı kesilir). Herhangi bir fikriniz neden?
user605957

Aynı sorunu yaşadım, setTranformMakeTranslation'ı (0,109) kaldırarak hem ipad hem de iphone'da benim için düzelttim. Onsuz doğru yerde ortaya çıktı.
joeld

2

Xamarin ve C # 'da:

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

Dizeyi UIAlertView'dan geri almak için John Riselvato'nun cevabına dayanarak ...

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];
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.