Aplikasi iOS: Bekerja Dengan Pemilih Berbilang Komponen



Blog ini adalah mengenai membuat aplikasi ios yang memaparkan penukaran dari satu unit ke unit yang lain. Ia menerangkan cara kerja Pemilih Mutlak Komponen, Makluman dll.

Untuk mendapatkan pandangan yang mendalam, sila baca . Ini adalah blog kedua siri aplikasi ios.





Sekiranya anda seorang pembangun berpengalaman yang ingin tahu mengenai cara kerja MultiComponent picker maka anda telah datang ke blog yang betul. Di blog ini, saya akan membincangkan bagaimana memperluas aplikasi penukaran kami dengan lebih banyak fungsi dengan menerapkan pemetik pelbagai komponen, dan juga cara melakukan pengendalian yang luar biasa menggunakan amaran.

Di dalamblog terakhir,kita telah melihatnya apabila kita menaip sesuatu di medan teks, papan kekunci muncul. Nilai yang hendak ditukar ditaip di medan teks dan kemudian kami melihat papan kekunci tidak hilang.



Untuk menyelesaikan masalah ini kita harus menambah butang yang merangkumi keseluruhan paparan. Apabila pengguna menyentuh mana sahaja di latar belakang, papan kekunci akan hilang.

Sekarang, mari kita teruskan dan melakukannya. Seret butang, tetapkan jenis butang sebagai warna kustom dan teks sebagai warna yang jelas dari pemeriksa atribut.

Pemeriksa Atribut



dan pilih Editor> Susun> Hantar ke Kembali

dan ubah saiz butang sedemikian rupa sehingga sesuai dengan keseluruhan paparan.

Butang ini sekarang bertindak sebagai butang latar yang tidak dapat dilihat yang diklik untuk papan kekunci hilang. Mari tulis IBAction untuk perkara yang sama, pilih mod pembantu editor dan kawalan + seret ke ViewController.h. Tetapkan Sambungan ke Tindakan dan namakan ke BackgroundButton dan klik sambung.

Kod pengawal pandangan kelihatan seperti ini sekarang.

#import @interface ViewController: UIViewController @property (kuat, nonatomic) IBOutlet UITextField * ValueTextField @property (kuat, nonatomik) IBOutlet UIPickerView * picker2 @property (kuat, nonatomik) NSArray * data @propertyLabel, kuat - (IBAction) Tukar: (UIButton *) pengirim - (IBAction) latar belakang Butang: (id) pengirim @end

Tukar ke ViewController.m dan kemudian tulis kod berikut.

- (IBAction) backgroundButton: (id) pengirim {[_ValueTextField mengundurkan diriFirstResponder] [_picker2 mengundurkan diriFirstResponder] [_ResultLabel meletakkan jawatan

Di sini kod memberitahu semua objek lain untuk menghasilkan status responden pertama apabila sentuhan dikesan. Sekarang, jalankan aplikasi dan lihat. Anda dapat mengetahui bahawa papan kekunci akan hilang semasa anda menyentuh latar belakang. Sekarang untuk papan kekunci pergi apabila anda selesai menaip, panggil kaedah BackgroundButton dalam kaedah pemilih didselectRow (). Jadi kod kaedahnya adalah seperti berikut.

- (void) pickerView: (UIPickerView *) pickerView didSelectRow: (NSInteger) baris inComponent: (NSInteger) komponen {selectValue = _data [baris] [latar belakang diriButton: 0]}

Sekarang, anda boleh mengerjakan bahagian kecantikan aplikasi, seperti menambahkan latar belakang dan mungkin juga memberikan gambar butang mewah. Walau bagaimanapun, dalam diri saya, saya akan menetapkan gambar latar.
Untuk melakukannya, cari gambar yang sesuai duh pertama! Kemudian tambahkan ke folder Images.xcassets dan ubah gambar dari skrin 1x ke 2x secara universal.

menukar binari menjadi java integer

Jalankan aplikasi dan lihat apakah ia berfungsi dengan baik.

Sekiranya saya menukar peranti ke iphone 5s.

Dan jalankan aplikasinya.

Di sini kita dapat melihat bahawa semuanya berfungsi dengan baik seperti yang diharapkan. Sekarang bagaimana jika saya mahu menambahkan latar belakang pada butang saya dan menjadikan penampilan lebih seperti butang? Untuk melakukan itu, saya akan terlebih dahulu menambahkan IBOutlet untuk butang tukar ke ViewController.h

@property (kuat, bukan atom) IBOutlet UIButton * menukar

dan kemudian tambahkan kod berikut dalam kaedah viewDidLoad ()

self.convert.backgroundColor = [UIColor colorWithRed: 0.4 green: 0.8 blue: 1.0 alpha: 1.0] [_convert setTitleColor: [UIColor whiteColor] forState: UIControlStateNormal]

Mari kita jalankan aplikasi kita dan lihat, apakah itu cara yang kita suka.

Baik bagus! Anda pasti menyedari bahawa saya juga telah mengubah kedudukan label hasil, sebab perubahan tersebut adalah sesuatu yang akan saya jelaskan kemudian.

java apa itu vektor

Kami tahu bahawa aplikasi kami bertukar dari Celsius ke Fahrenheit dan hanya sebaliknya. Jadi, bagaimana dengan menambah beberapa fungsi atau unit untuk ditukar? Untuk melakukannya, kita perlu menambahkan satu komponen lagi ke UIPickerView yang memberikan pilihan yang sesuai, ketika satu unit dipilih dalam komponen pemilih pertama.

Untuk membuat pemilih terbahagi kepada dua komponen, kita perlu menambahkan data NSArray baru2, yang akan menyimpan data untuk komponen kedua. Juga, tentukan dua pemalar yang akan mewakili dua komponen kita. Di sini, komponen kiri dinyatakan 0 dan komponen kanan dinyatakan 1 untuk kesederhanaan pengaturcaraan.

Fail ViewController.h anda kelihatan seperti

#import # define data1comp 0 # define data2comp 1 @interface ViewController: UIViewController @property (strong, nonatomic) IBOutlet UITextField * ValueTextField @property (kuat, nonatomik) IBOutlet UIPickerView * picker2 @property (strong, nonpromic kuat, bukan atom) NSArray * data2 @property (kuat, bukan atom) IBOutlet UILabel * ResultLabel @property (kuat, bukan atom) IBOutlet UIButton * tukar - (IBAction) Tukar: (UIButton *) pengirim - (IBAction) latar belakang Butang: (id) pengirim @akhir

Sekarang tentukan array data2 dalam kaedah ViewDidLoad (). Sekarang kita mempunyai kedua sumber data, kita mesti dapat menulis kod untuk pemetik sedemikian rupa sehingga ketika kita memilih item dari komponen pertama pemetik, komponen kedua secara automatik akan berubah menjadi nilai yang sesuai. Komponen kedua bergantung pada pemilihan yang pertama.
Untuk ini, kita perlu menentukan kamus yang akan menyimpan kunci dan nilai. Kunci mengandungi data yang sesuai dengan komponen pertama pemetik, dan nilai-nilai mengandungi data yang sesuai dengan komponen kedua pemetik.

- (void) viewDidLoad {[super viewDidLoad] // Lakukan sebarang persediaan tambahan setelah memuatkan paparan, biasanya dari nib. _data1 = [NSArray arrayWithObjects: @ 'Celsius', @ 'Fahrenheit', @ 'Meter', @ 'Centimeter', nil] data2 = [NSArray arrayWithObjects: @ 'Centimeter', @ 'Meter', @ 'Fahrenheit', @ Kamus 'Celsius', nil] = [kamus NSDictionaryWithObjectsAndKeys: @ 'Celcius', @ 'Farenheit', @ 'Farenheit', @ 'Celcius', @ 'Meter', @ 'Centimeter', @ 'Centimeter', @ 'Meter ', nil] self.view.backgroundColor = [UIColor colorWithPatternImage: [UIImage imageNamed: (@' bg2.png ')]]}

Sekarang, kita mesti mengubah sumber data dan mendelegasikan kaedah pemilih semasa ke yang berikut, sehingga kita mempunyai data yang diisi di kedua komponen.

- (NSInteger) numberOfComponentsInPickerView: (UIPickerView *) pickerView {return 2} - (NSInteger) pickerView: (UIPickerView *) pickerView numberOfRowsInComponent: (NSInteger) komponen {if (komponen == data1com) [self.data2 count]} - (NSString *) pickerView: (UIPickerView *) pickerView titleForRow: (NSInteger) baris forComponent: (NSInteger) komponen {if (komponen == data1comp) {return [self.data1 objectAtIndex: baris]} kembali [self.data2 objectAtIndex: row]} - (void) pickerView: (UIPickerView *) pickerView didSelectRow: (NSInteger) baris inComponent: (NSInteger) komponen {[self backgroundButton: 0] if (komponen == data1comp) {NSString * data11 = [_ data1 objectAtIndex: baris] NSArray * a = [kamus objekForKey: data11] secondrow = [self.data2 indexOfObject: a] [_picker2 selectRow: secondrow inComponent: data2comp animated: YES] [_picker2 reloadComponent dipilih: data2comp = baris}}

Di sini, dalam kaedah didSelectRow (), kita mendapatkan nilai terpilih dari komponen pertama, kemudian kita memberikannya sebagai argumen ke kaedah objectForKey () kamus, dan mendapatkan nilai yang sesuai untuk kunci. Untuk mencari kedudukan yang sesuai untuk nilai dalam array kedua iaitu data2, kami menggunakan kaedah indexOfObject () dari array dan menyimpan hasilnya dalam nilai integer.
Kami kemudian meneruskan nilai integer ini ke kaedah picker selectRow: row inComponent: komponen (). Dan muatkan semula komponen pemetik menggunakan reloadComponent ().
Setelah kami melakukan ini, kerana kami memilih satu item dari komponen pertama, item yang sesuai akan dipilih dalam komponen pemetik kedua.

Kod untuk didSelectRow ()

- (void) pickerView: (UIPickerView *) pickerView didSelectRow: (NSInteger) baris inComponent: (NSInteger) komponen {[latar belakang diriButton: 0] if (komponen == data1comp) {NSString * data11 = [_ data1 objekAtIndex: baris] NSA a = [kamus objekForKey: data11] secondrow = [self.data2 indexOfObject: a] [_picker2 selectRow: secondrow inComponent: data2comp animated: YES] [_picker2 reloadComponent: data2comp] selectValue = data11 terpilihRow = baris}}

Sekarang jalankan aplikasinya dan lihat, apakah pemetik berfungsi seperti yang diharapkan.

Voila! ianya berfungsi!

Oleh itu, marilah kita terus membuat kod butang tukar kita. Pemilih sebelumnya hanya mempunyai dua nilai untuk dipadankan iaitu Celsius dan Fahrenheit dan kemudian hasilnya dikira. Tetapi sekarang kita mempunyai empat nilai Celsius, Fahrenheit, Meter dan Centimeter. Oleh itu, saya telah menggunakan pernyataan beralih, yang mengira nilai berdasarkan pemboleh ubah baris yang dipilih.

- (IBAction) Convert: (UIButton *) sender {float val = [_ ValueTextField.text floatValue] NSLog (@ 'value% f', val) switch (selectRow) {case 0: // Celsius to Fahrenheit res = (val * 1.8) + 32break case 1: // Fahrenheit to Celsius res = (val-32) /1.8 case case 2: // Meter to Centimeter res = val * 100 break case 3: // Centimeter to Meter res = val * 0.01 break lalai: res = 0.0} NSString * final = [NSString stringWithFormat: @ '%. 02f', res] _ResultLabel.text = final}

jika anda menjalankan aplikasinya, kami dapat melihat bahawa semuanya berfungsi dengan baik.

Sekarang, kita dapat memeriksa pengecualian yang boleh berlaku di aplikasi kita. Contohnya, tidak ada nilai dalam kotak teks. Atau kita cuba menukar dari Celsius ke Meter atau Sentimeter, yang sebenarnya tidak mungkin. Situasi seperti ini disebut sebagai pengecualian dan kita mesti menghindarinya dengan menulis kod untuk mengatasi kesalahan tersebut.

Mari kita selesaikan jenis ralat pertama yang boleh berlaku semasa kita menjalankan aplikasi kita. Maksudnya, kita terlepas untuk menulis nilai kita untuk ditukar di medan teks. Untuk senario ini, kita mesti memberi amaran kepada pengguna untuk memasukkan nilai dan kemudian meneruskannya.

Kita boleh menggunakan UIAlertView untuk ini. Kita boleh menulis kaedah bernama mesej showAlertWithMessage (NSString *). Dalam kaedah ini, kita dapat menyatakan alertView dan akhirnya memaparkannya menggunakan kaedah show (). Kod untuk kaedah tersebut adalah seperti berikut.

- (void) showAlertWithMessage: (NSString *) mesej {UIAlertView * alertView = [[UIAlertView allow] initWithTitle: @ 'Error' message: message delegate: self cancelButtonTitle: nil otherButtonTitles: @ 'Okay', nil] alertView.tag = 100 _ResultLabel.text=@'Tiada Hasil '[alertView show]}

Sekarang kaedah ini apabila pengguna mengklik butang tukar harus dipanggil sebagai penukaran. Penukaran tidak boleh dilakukan tanpa memasukkan nilai. Oleh itu, dalam definisi kaedah untuk menukar, kita mesti memeriksa sama ada panjang medan teks lebih besar daripada atau sama dengan sifar atau tidak. Sekiranya berlaku kemudian lakukan penukaran, maka perhatikan yang lain. Oleh itu, kod butang tukar seperti:

- (IBAction) Tukar: (UIButton *) pengirim {if ([_ ValueTextField.text length]<= 0) { [self showAlertWithMessage:@' Please enter the value'] } else { float res=0.0 float val=[_ValueTextField.text floatValue] NSLog(@'value %f',val) switch(selectedRow) { case 0:// Celsius to Fahrenheit res=(val*1.8)+32break case 1: // Fahrenheit to Celsius res=(val-32)/1.8break case 2: // meter to centimeter res= val*100 break case 3://centimeter to meter res=val*0.01 break default: res=0.0 } NSString *final= [NSString stringWithFormat:@'%.02f',res] _ResultLabel.text = final } }

Sekarang jalankan aplikasi dan cuba klik pada butang tukar tanpa memasukkan nilai di medan teks.

Jenis pengecualian kedua yang boleh berlaku adalah jika nilai pada komponen pertama tidak sesuai dengan nilai pada komponen kedua dari UIPickerView. Untuk ini, kami memeriksa sama ada nilai baris komponen terpilih semasa komponen kedua sama dengan nilai nilai baris yang dikembalikan oleh delegasi didSelectRow () kaedah. Sekiranya keadaan tidak sepadan, maka penukaran tidak mungkin dilakukan dan jika nilainya sepadan maka penukaran dapat dilakukan.

Kita boleh melaksanakan logik ini seperti berikut,

- (IBAction) Tukar: (UIButton *) pengirim {if ([_ ValueTextField.text length]<= 0) { [self showAlertWithMessage:@' Please enter the value'] } else { _ResultLabel.textColor= [UIColor blackColor] float res=0.0 NSInteger n =[_picker2 selectedRowInComponent:data2comp] if(n==secondrow) { float val=[_ValueTextField.text floatValue] NSLog(@'value %f',val) switch(selectedRow) { case 0:// Celsius to Fahrenheit res=(val*1.8)+32break case 1: // Fahrenheit to Celsius res=(val-32)/1.8break case 2: // meter to centimeter res= val*100 break case 3://centimeter to meter res=val*0.01 break default: res=0.0 } NSString *final= [NSString stringWithFormat:@'%.02f',res] _ResultLabel.text = final } else { // code for displaying error. _ResultLabel.textColor= [UIColor redColor] _ResultLabel.text = @'Result cannot be calculated' } }

Sekarang jalankan aplikasi dan lihat dengan mengubah nilai pada komponen kedua setelah anda membuat pilihan pada komponen pertama.

Anda dapat melihat mesej ralat, bahawa hasilnya tidak dapat dihitung. Anda akan melihat bahawa mesej ralat dicetak pada label hasil yang sama, dan mesejnya panjang. Jadi inilah sebabnya label diturunkan dari orientasi sebelumnya.

Oleh itu, aplikasi penukaran kami sudah lengkap. Anda boleh menambahkan lebih banyak fungsi ke aplikasi mengikut pilihan anda dan menjadikannya lebih cantik mengikut kreativiti anda.

Ada soalan untuk kami? Sebutkannya di bahagian komen dan kami akan menghubungi anda.

Catatan berkaitan: