Apa cara sederhana untuk mendapatkan kotak dialog sembulan input teks pada iPhone


125

Saya ingin mendapatkan nama pengguna. Kotak dialog input teks sederhana. Adakah cara sederhana untuk melakukan ini?


1
tunggu saja beberapa bulan, sampai sekitar bulan september, dan hidup Anda akan jauh lebih mudah.
Jonathan.

Jawaban:


264

Di iOS 5 ada cara baru dan mudah untuk ini. Saya tidak yakin apakah implementasinya sepenuhnya lengkap karena ini tidak ramah seperti, katakanlah UITableViewCell, tetapi pasti harus melakukan trik karena sekarang standar didukung di API iOS. Anda tidak perlu API pribadi untuk ini.

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

Ini menjadikan lansiran seperti ini (tangkapan layar diambil dari simulator iPhone 5.0 di XCode 4.2):

contoh peringatan dengan alertViewStyle diatur ke UIAlertViewStylePlainTextInput

Saat menekan tombol apa saja, metode delegasi biasa akan dipanggil dan Anda dapat mengekstrak textInput di sana seperti:

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

Di sini saya hanya NSLog hasil yang dimasukkan. Dalam kode produksi, Anda mungkin harus menyimpan pointer ke alertView Anda sebagai variabel global atau menggunakan tag alertView untuk memeriksa apakah fungsi delegasi dipanggil oleh yang sesuai UIAlertViewtetapi untuk contoh ini ini harus baik-baik saja.

Anda harus memeriksa API UIAlertView dan Anda akan melihat ada lebih banyak gaya yang ditentukan.

Semoga ini bisa membantu!

- EDIT -

Saya bermain-main dengan alertView sedikit dan saya kira tidak perlu pengumuman bahwa sangat mungkin untuk mengedit TextField seperti yang diinginkan: Anda dapat membuat referensi ke UITextFielddan mengeditnya seperti biasa (secara terprogram). Melakukan ini, saya membuat sebuah alertView seperti yang Anda tentukan dalam pertanyaan awal Anda. Lebih baik terlambat daripada tidak, kan :-)?

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

Ini menghasilkan lansiran ini:

UIAlertView yang menggunakan alertStyle UIAlertViewPlainTextInput untuk menanyakan nama pengguna

Anda dapat menggunakan metode delegasi yang sama seperti yang saya poster sebelumnya untuk memproses hasil dari input. Saya tidak yakin apakah Anda dapat mencegah UIAlertViewpemberhentian meskipun (tidak ada shouldDismissfungsi delegasi AFAIK) jadi saya kira jika input pengguna tidak valid, Anda harus memasang peringatan baru (atau hanya kembalishow ini) sampai input yang benar adalah dimasukkan.

Selamat bersenang-senang!


1
Dengan Penghitungan Referensi Otomatis, Anda tidak seharusnya menyimpan dan melepaskan objek lagi.
Waqleh

5
Saya tahu, tetapi jawaban ini ditulis pada tahun 2011.
Warkst

3
Metode ini disusutkan sejak iOS 9.0. Gunakan sebaliknya UIAlertController:
EckhardN

Jika Anda mencari dukungan dengan Swift 4: stackoverflow.com/a/10689318/525576
John Riselvato

186

Untuk memastikan Anda mendapatkan panggilan balik setelah pengguna memasukkan teks, setel delegasi di dalam handler konfigurasi. textField.delegate = self

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

In Swift (iOS 8-10):

masukkan deskripsi gambar di sini

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)
}

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

UNTUK iOS 5-7:

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

masukkan deskripsi gambar di sini


CATATAN: Di bawah ini tidak berfungsi dengan iOS 7 (iOS 4 - 6 Works)

Hanya untuk menambah versi lain.

UIAlert Dengan UITextField

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

}

maka saya menelepon [alert show]; ketika saya menginginkannya.

Metode yang berlaku

- (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
Saya memiliki sesuatu seperti ini sejak iOS 4 tetapi tampaknya rusak di OS 7 Sekarang gunakan kode Wakrst - simpan banyak baris kode.
Dave Appleton

Jadi, apa cara yang benar untuk melakukan ini untuk iOS7? Kami sedang membangun dengan iOS6 SDK tetapi masih terlihat aneh di iOS7.
sebrock

Menambahkan dukungan iOS7 ke pertanyaan
John Riselvato

1
Ditemukan saya harus memasukkan yang berikut ini dalam alertView:(UIAlertView *) clickedButtonAtIndex:(NSInteger)buttonIndexmetode delegasi saya untuk mengambil nilai dari textField.text: `NSString * theMessage = [alertView textFieldAtIndex: 0] .text;`
James Perih

1
ganti "var alert" dengan "let alert" di kode cepat untuk mematuhi versi terbaru swift
Matei Suica

11

Menguji cuplikan kode ketiga Warkst - bekerja dengan sangat baik, kecuali saya mengubahnya menjadi tipe input default alih-alih numerik:

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

Poin bagus! Saya mengotak-atik textField pada saat itu dan lupa mengubah jenis keyboard sebelum mengunggah cuplikan kode. Senang kode saya dapat membantu Anda!
Warkst

11

Sejak iOS 9.0 gunakan 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

Hanya ingin menambahkan sepotong informasi penting yang saya yakin ditinggalkan dengan asumsi bahwa orang yang mencari jawaban mungkin sudah tahu. Masalah ini sering terjadi dan saya menemukan diri saya mandek ketika saya mencoba menerapkan viewAlertmetode untuk tombol-tombol UIAlertViewpesan. Untuk melakukan ini, Anda perlu menambahkan 1 kelas delegasi yang mungkin terlihat seperti ini:

@interface YourViewController : UIViewController <UIAlertViewDelegate>

Anda juga dapat menemukan tutorial yang sangat membantu di sini !

Semoga ini membantu.


5

Coba kode Swift ini dalam 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

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

Saya akan menggunakan UIAlertViewdengan UITextFieldsubview. Anda dapat menambahkan bidang teks secara manual atau, di iOS 5, menggunakan salah satu metode baru.


Saya menambahkan kode berikut dari posting lain, tetapi popup muncul dari layar (sangat banyak di atas, dengan hanya bagian bawah terlihat)
user605957

2
codeUIAlertView * myAlertView = [[Alokasi UIAlertView] initWithTitle: @ "Pesan Anda di sini" pesan: @ "ini akan ditanggung" delegasi: self cancelButtonTitle: @ "Batalkan" otherButtonTitles: @ "OK", nil]; UITextField * myTextField = [[Alokasi UITextField] 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]; [acara myAlertView]; [rilis myAlertView];
user605957

Saya mencoba kode serupa dan ini menampilkan tampilan peringatan dengan kotak teks dan tombol tetapi tidak ada cukup ruang untuk bidang teks, itu terjebak di antara judul dan tombol dan menyentuh keduanya. Saya mencoba beberapa transformasi untuk skala bingkai tetapi tombol tetap di tempat mereka jadi mereka perlu dipindahkan juga. Saya tidak tahu cara memposisikan ulang tombol dan saya tidak percaya bahwa semua ini diperlukan untuk mengambil satu baris teks dari prompt ke pengguna. Apakah tidak ada cara yang lebih baik dari ini?
Dean Davids

2

Tambahkan tampilan ke UIAlertView seperti ini . Di iOS 5 ada beberapa hal "ajaib" yang melakukannya untuk Anda (tapi itu semua di bawah NDA).


Saya mencoba ini dan itu agak berhasil. Kecuali popup yang keluar dari layar (bagian atas popup dimatikan). Ada ide mengapa?
user605957

Saya memiliki masalah yang sama, menghapus setTranformMakeTranslation (0,109) memperbaikinya untuk saya di iPad dan iPhone. Itu muncul di tempat yang tepat tanpanya.
joeld

2

Dalam Xamarin dan 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

Membangun jawaban John Riselvato, untuk mengambil kembali string dari 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];
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.