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):
Saat menekan tombol apa saja, metode delegasi biasa akan dipanggil dan Anda dapat mengekstrak textInput di sana seperti:
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:
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.
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)
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 debuggerif([textField.text length]<=0|| buttonIndex ==0){return;//If cancel or 0 length string the string doesn't matter}if(buttonIndex ==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];
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:
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)->Voidin// 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)->Voidinprint("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;}
Saya akan menggunakan UIAlertViewdengan UITextFieldsubview. Anda dapat menambahkan bidang teks secara manual atau, di iOS 5, menggunakan salah satu metode baru.
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 =newUIAlertView("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();
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})
Jawaban:
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.Ini menjadikan lansiran seperti ini (tangkapan layar diambil dari simulator iPhone 5.0 di XCode 4.2):
Saat menekan tombol apa saja, metode delegasi biasa akan dipanggil dan Anda dapat mengekstrak textInput di sana seperti:
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
UIAlertView
tetapi 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
UITextField
dan 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 :-)?Ini menghasilkan lansiran ini:
Anda dapat menggunakan metode delegasi yang sama seperti yang saya poster sebelumnya untuk memproses hasil dari input. Saya tidak yakin apakah Anda dapat mencegah
UIAlertView
pemberhentian meskipun (tidak adashouldDismiss
fungsi 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!
sumber
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):
In Swift (iOS 8-10):
Di Objective-C (iOS 8):
UNTUK iOS 5-7:
CATATAN: Di bawah ini tidak berfungsi dengan iOS 7 (iOS 4 - 6 Works)
Hanya untuk menambah versi lain.
maka saya menelepon
[alert show];
ketika saya menginginkannya.Metode yang berlaku
sumber
alertView:(UIAlertView *) clickedButtonAtIndex:(NSInteger)buttonIndex
metode delegasi saya untuk mengambil nilai dari textField.text: `NSString * theMessage = [alertView textFieldAtIndex: 0] .text;`Menguji cuplikan kode ketiga Warkst - bekerja dengan sangat baik, kecuali saya mengubahnya menjadi tipe input default alih-alih numerik:
sumber
Sejak iOS 9.0 gunakan UIAlertController:
sumber
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
viewAlert
metode untuk tombol-tombolUIAlertView
pesan. 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.
sumber
Coba kode Swift ini dalam UIViewController -
sumber
Swift 3:
sumber
Saya akan menggunakan
UIAlertView
denganUITextField
subview. Anda dapat menambahkan bidang teks secara manual atau, di iOS 5, menggunakan salah satu metode baru.sumber
code
UIAlertView * 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];Tambahkan tampilan ke UIAlertView seperti ini . Di iOS 5 ada beberapa hal "ajaib" yang melakukannya untuk Anda (tapi itu semua di bawah NDA).
sumber
Dalam Xamarin dan C #:
sumber
Membangun jawaban John Riselvato, untuk mengambil kembali string dari UIAlertView ...
sumber
sumber