Pertanyaan Keyboard muncul setelah UIAlertView ditutup pada iOS 8.3 untuk iPad


Dengan rilis iOS 8.3 terbaru, aplikasi kami mulai memiliki perilaku aneh.

Setelah menyelesaikan pengeditan teks, pengguna dapat mengklik tombol tutup yang menampilkan UIAlertView. Ketika pengguna mengklik membuang di tampilan lansiran, lansiran, dan tampilan saat ini ditutup. Tapi entah bagaimana keyboard muncul setelah tampilan hilang yang cukup mengganggu bagi pengguna.

Setelah beberapa debugging, tampaknya keyboard ditampilkan untuk textfield terakhir yang telah diakses pengguna sebelum menutup tampilan. Saya mencoba berbagai cara endEditing untuk tampilan saat ini di banyak tempat (sebelum ditayangkan UIAlertView, setelah mengklik tombol di UIAlertView; Saya bahkan mengatur fokus ke elemen UI lain dari tampilan). Itu tidak memecahkan masalah.

Tetapi untuk masalah khusus ini, saya tidak yakin apakah itu masalah umum atau sesuatu yang perlu diperbaiki. Semuanya bekerja dengan sempurna sebelum iOS 8.3.

Kami mengerti itu UIAlertView tidak lagi digunakan untuk iOS 8. Kami mulai bermigrasi ke UIAlertController. Tetapi jika ada solusi, kami ingin mendengarnya.

Ini beberapa cuplikan kode.

- (IBAction)closeTapped:(UIButton *)sender
{
    // try to resign first responder
    // [self.tfName resignFirstResponder];
    // [self.tfPosition resignFirstResponder];
    [self.view endEditing:YES];

    if(self.orderDetails.isOpen && self.orderItemChanged)
    {
        UIAlertView* saveAlert = [[UIAlertView alloc] initWithTitle:@"Unsaved Changes"
                                                            message:@"Your changes have not been saved. Discard changes?"
                                                           delegate:self
                                                  cancelButtonTitle:@"Cancel"
                                                  otherButtonTitles:@"Save", @"Discard", nil];
        [saveAlert show];
    }
    else
    {
        [self close];
    }
}

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
    switch(buttonIndex)
    {
        case 1: // Save
        {
            [self save];
            break;
        }
        case 2: // Discard
        {
            [self close];
            break;
        }
    }
}

- (void)close
{   
    [self.delegate dismissEditOrderItemVC];
}

32
2018-05-08 17:09


asal


Jawaban:


Jika target penerapan Anda adalah iOS 8+, cobalah UIAlertController.

Berikut perbaikan cepat untuk UIAlertView: menunda permintaan untuk menampilkan tampilan peringatan ketika bidang teks atau tampilan teks Anda mengundurkan diri dari responden pertama.

[self performSelector:@selector(showAlertView) withObject:nil afterDelay:0.6];

14
2017-11-16 07:04



Jika ada yang bergumul dengan ini, saya harap ini akan membantu:

if (NSClassFromString(@"UIAlertController")) {
    UIAlertController* alert = ...
}
else {
    UIAlertView* alert = ...
}

3
2018-06-04 12:17



Anda perlu mengubah peringatan untuk iOS 8.3

pertama tempatkan ini dalam pandangan Anda

#define IS_IOS8 [[UIDevice currentDevice].systemVersion floatValue] >= 8.0

kemudian

if (IS_IOS8) {

        UIAlertController *alertVC = [UIAlertController alertControllerWithTitle:@"Unsaved Changes" message:@"Your changes have not been saved. Discard changes?" preferredStyle:UIAlertControllerStyleAlert];

        UIAlertAction *saveAction = [UIAlertAction
                                    actionWithTitle:@"Save"
                                    style:UIAlertActionStyleCancel
                                    handler:^(UIAlertAction *action)
                                    {
                                        [self save];
                                    }];

        UIAlertAction *cancelAction = [UIAlertAction
                                   actionWithTitle:@"Cancel"
                                   style:UIAlertActionStyleCancel
                                   handler:^(UIAlertAction *action)
                                   {
                                       [alertVC dismissViewControllerAnimated:YES completion:nil];
                                   }];


        UIAlertAction *discardAction = [UIAlertAction
                                   actionWithTitle:@"Discard"
                                   style:UIAlertActionStyleCancel
                                   handler:^(UIAlertAction *action)
                                   {
                                       [alertVC dismissViewControllerAnimated:YES completion:nil];
                                   }];



        [alertVC addAction:saveAction];
        [alertVC addAction:cancelAction];
        [alertVC addAction:discardAction];
        [self.view.window.rootViewController presentViewController:alertVC animated:YES completion:nil];

ini akan membantu Anda karena membantu saya dalam masalah yang sama. kode di atas kompatibel dengan ios 7 & 8


2
2017-07-08 07:21



Saya juga, memiliki keyboard yang muncul (dengan kursor di textView yang terakhir digunakan) setelah menutup UIAlertController dan di sini adalah perbaikan yang sangat sederhana:

Segera sebelum membangun dan mempresentasikan UIAlertController,

Menggunakan [_activeTextView resignFirstResponder]; keyboard akan muncul kembali. Menggunakan [self.view endEditing: YES]; keyboard TIDAK akan muncul kembali.

Saya harap ini membantu Anda.


2
2018-05-08 20:57



Coba gunakan kode di bawah ini. Ini berfungsi dengan baik untuk iOS 8 dan versi di bawahnya

if (IS_OS_8_OR_LATER) {
        UIAlertController *alertVC = [UIAlertController alertControllerWithTitle:title message:msg preferredStyle:UIAlertControllerStyleAlert];

        UIAlertAction *cancelAction = [UIAlertAction
                                     actionWithTitle:@"OK"
                                     style:UIAlertActionStyleCancel
                                     handler:^(UIAlertAction *action)
                                     {

                                     }];
        [alertVC addAction:cancelAction];

        [[[[[UIApplication sharedApplication] windows] objectAtIndex:0] rootViewController] presentViewController:alertVC animated:YES completion:^{

        }];
    }
    else{
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:title message:msg delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil];
        [alert show];
    }

}


1
2017-08-19 16:51



Jika bidang teks adalah responden pertama, maka secara otomatis akan muncul keyboard ketika peringatan ditutup. Pastikan responden pertama diberhentikan dengan benar:

[textField resignFirstResponder]

Ingat: dalam tampilan tabel atau gulir, terkadang bidang harus terlihat di layar untuk memecat responden dengan benar.

Jika tidak ada penanggap aktif pertama, keyboard seharusnya tidak muncul ketika peringatan diberhentikan.

Untuk kasus tertentu dalam pertanyaan ini, saya akan merekomendasikan pengaturan metode delegasi untuk mendengarkan tombol "selesai" dan mengundurkan diri responden pertama dalam panggilan balik delegasi.

Alternatif lain, ketika mulai mengedit, Anda dapat menyimpan referensi ke bidang teks yang sedang aktif, kemudian dalam metode "clickedButtonAtIndex" Anda dapat mengundurkan diri dari bidang teks aktif jika masih aktif.


1
2018-05-08 18:15



Saya telah melihat beberapa perilaku aneh dengan keyboard textField dan alertViews juga ... Mungkin membuat bool yang disebut disableKeyboard dan menggunakannya seperti ini:

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField {

    if (disableKeyBoard) {

        disableKeyboard = NO;
        return NO;

    } else {

        return YES;

    }

}

- (void)alertView:(UIAlertView *)alertView willDismissWithButtonIndex:(NSInteger)buttonIndex {

    disableKeyboard = YES;

}

Ini hanyalah solusi dan tidak membahas masalah inti, apa pun itu. Agar metode ini berfungsi, Anda perlu mengatur metode delegasiViewView dan textField di header Anda.


0
2018-05-08 18:09