Menyisih dari UISceneDelegate / SwiftUI di iOS

111

Saat ini saya menggunakan Xcode 11 Beta 5. Dalam aplikasi saya, ini berjalan dengan baik di iOS 12 dan di bawahnya. Namun, di iOS 13 sepertinya menggunakan UIScenedefault. Ini menyebabkan aplikasi saya tidak melakukan apa pun.

Saat aplikasi diluncurkan pada penginstalan baru, ada persyaratan dan ketentuan yang harus diterima pengguna. Setelah setuju, mereka pergi ke layar pemuatan yang kemudian mengarahkan mereka ke tampilan utama. Pada tangkapan layar yang saya posting, tampilan di belakang yang sekarang di latar depan adalah layar pemuatan splash.

Kami akan segera mempertimbangkan untuk menambahkan beberapa tampilan pemandangan di seluruh aplikasi, tetapi saat ini kami memiliki hal-hal dengan prioritas lebih tinggi yang perlu kami kerjakan.

https://imgur.com/i0qLhAL

"Mendukung banyak jendela" sudah dinonaktifkan di pengaturan Umum target aplikasi. Juga saya telah Mengaktifkan Beberapa Windows diatur ke NO di file info.plist.

Sejauh ini tidak ada yang benar-benar berhasil. Pada dasarnya saya ingin memilih keluar / menonaktifkan banyak jendela dan UIScene / SwiftUI untuk mengembalikan perilaku asli di iOS 10-12. Apakah ini mungkin di iOS 13 atau kita harus memperbaruinya?

Memperbarui:

Berikut adalah tangkapan layar dari hierarki tampilan debug. Sisi kiri adalah iOS 12, sisi kanan pada iOS 13. Tanpa menambahkan apa pun ke Info.plist atau kelas atau metode delegasi adegan apa pun, mengapa berbeda? Cukup banyak menjalankannya dalam kode siap produksi yang ada di Xcode 11.

https://imgur.com/C3aLsDo

DavidA
sumber
Apakah Anda hanya perlu mendukung iOS 13 dan yang lebih baru atau apakah Anda perlu mendukung iOS 13 dan iOS 12?
rmaddy
Dukungan @rmaddy antara iOS 11-13 + (versi mendatang).
DavidA
Apakah UI utama Anda melalui kode atau storyboard?
rmaddy
@rmaddy itu dilakukan di storyboard memiliki segue itu direferensikan xib ViewControllers.
DavidA
Tanpa detail spesifik tentang apa yang dilakukan aplikasi Anda dan kapan, sulit untuk mengatakannya. Perhatikan bahwa metode pengontrol tampilan seperti viewWill|DidAppeartidak disebut sama di iOS 13 saat menutup pengontrol tampilan yang disajikan, misalnya. Tambahkan banyak pesan debugging siklus hidup dan breakpoints dan bandingkan aliran antara iOS 12 dan 13 dan lihat perbedaannya.
rmaddy

Jawaban:

312

Meskipun Anda harus menggunakan scene saat aplikasi Anda dijalankan di bawah iOS 13 dan lebih baru, Anda dapat memilih keluar sepenuhnya saat Anda masih mendukung iOS 12 atau lebih lama.

  • Hapus sepenuhnya entri "Application Scene Manifest" dari Info.plist.

  • Jika ada kelas delegasi adegan, hapus itu.

  • Jika ada metode terkait pemandangan dalam delegasi aplikasi Anda, hapus metode tersebut.

  • Jika tidak ada, tambahkan properti var window: UIWindow?ke delegasi aplikasi Anda.

Aplikasi Anda sekarang hanya boleh menggunakan app delegate dan di bawah iOS 13 harus memiliki siklus hidup yang sama seperti iOS 12.

Catatan: Tidak ada yang khusus untuk Swift atau SwiftUI.

rmaddy
sumber
Kami memposting jawaban pada waktu yang sama. :-) Satu pertanyaan - baris yang hilang AppDelegateitu yang saya tujukan. Apakah itu secara otomatis kembali dalam proses yang Anda jelaskan ini? (Saya agak menyukai jawaban Anda lebih baik, karena sama sekali mengabaikan adegan.)
dfd
1
Hal yang sama terjadi pada saya dan saya tidak memiliki entri manifes di Info.plist saya maupun metode AppDelegate dan juga tidak ada kelas SceneDelegate. Saya menyetel pengontrol saya seperti "syarat dan ketentuan" untuk David sebagai rootViewController dan tampilannya sama seperti yang ditunjukkan di sini pada pertanyaan di atas. Tolong bantu karena saya terjebak dengan kesalahan UI ini dan tidak dapat bergerak maju .. ugh!
Mohsin Khubaib Ahmed
1
@MohsinKhubaibAhmed Anda menanyakan tentang masalah yang sama sekali berbeda. Lihat stackoverflow.com/questions/56435510/…
rmaddy
1
Halo yang disana! Saya mengikuti instruksi 3-langkah tetapi mendapat layar hitam setelah layar peluncuran muncul. Papan Cerita Utama dipilih dan juga pengontrol tampilan awal. Apakah Anda punya saran?
pengguna3191334
1
@ user3191334 Saya mendapat layar hitam juga. Dalam kasus saya, itu adalah mode gelap yang memberi saya latar belakang hitam default. Tambahkan beberapa konten ke papan cerita dasar Anda dan semua akan muncul.
Gordon Dove
41

Menggunakan jawaban untuk mudah-mudahan memformat sesuatu dengan lebih baik daripada komentar. (Jangan ragu untuk berkomentar dan saya akan mengedit.)

Ini adalah sesuatu yang saya hadapi juga, dan ada beberapa skenario yang dimainkan di sini:

  • Jika Anda ingin mengerjakan aplikasi yang adaUIKit di Xcode 11, cukup buka dan itu akan berfungsi dengan baik. Semua aplikasi saya memiliki, tanpa SceneDelegate file atau perubahan apa punAppDelegate atau storyboard.
  • Jika Anda ingin membuat aplikasi baru yang UIKITmenargetkan iOS 13 , cukup buat sambil memastikan Anda membiarkan kotak centang "Gunakan SwiftUI" tidak dicentang.

Tetapi saya bertanya-tanya apakah Anda menghadapi skenario ketiga - yang saya lakukan sekitar seminggu yang lalu. Membuat `aplikasi UIKit baru yang menargetkan sesuatu yang lebih awal dari iOS 13 . (Saya sebenarnya menargetkan iOS 9!)

Ya, template Anda akan memberikan 15 kesalahan (pada beta 5), ​​bersama dengan file SceneDelegate file / kelas. Untungnya, Xcode akan membantu Anda mengoreksi semua kecuali satu secara otomatis.

Yang terakhir adalah menambahkan satu baris yang merupakan bagian dari SceneDelegatekelas tetapi sayangnya Apple meninggalkannya di luar AppDelegatekelas - yang setelah lebih dari selusin @available(iOS 13.0, *)klausul berarti Anda telah memilih untuk tidak SceneDelegatemenjalankan iOS 12 dan coba tebak? Ini tidak ada di ApDelegate!

Tambahkan ini ke AppDelegate Anda:

var window: UIWindow?

Pada titik itu, Anda harus memiliki UIKitaplikasi yang sedang berjalan yang ditargetkan untuk iOS 12 dan sebelumnya.

dfd
sumber
Terima kasih untuk ini. Skenario saya adalah poin pertama yang Anda katakan, aplikasi UIKit yang ada di Xcode 11. Tetapi ketika saya membukanya, itu tidak berfungsi dengan baik. Lihat pembaruan yang saya tambahkan dari tampilan debug hierarki.
DavidA
Juga di AppDelegate, itu sudah memiliki jendela var: UIWindow?
DavidA
Anda membuat saya khawatir! (Dan saya masih agak khawatir.) Saya telah memperbarui sangat sedikit untuk aplikasi saya yang ada - minggu lalu saya merasa frustrasi dengan SwiftUI dan saya ingin tahu tentang mencoba tata letak di UIKit untuk iOS 13 saja. Tapi aplikasi saya yang sudah ada? Mereka mendukung multi-tasking iPad tetapi dibiarkan tidak berubah di Xcode 11 Saya tidak punya SceneDelegatedan pengujian mengatakan (a) mereka bekerja di iOS 13 dan (b) mereka tidak mendukung banyak jendela sama sekali, hanya membagi tampilan antara dua aplikasi. (Saya juga tidak mendukung seret-dan-lepas.) Apakah ada hal lain yang terjadi di pihak Anda?
dfd
Untuk mengulang, saya cukup membuka aplikasi Xcode 10 saya di Xcode 11. Tidak SceneDelegate, tidak SwiftUI, tidak ada kemampuan untuk membuat banyak contoh aplikasi iOS 9+ saya. Performanya sama seperti biasanya - semuanya adalah CoreImagefilter kustom yang diperbarui secara real-time - dan, menurut saya? Jika ada beberapa masalah terkait OS yang terkait dengan adegan dalam hierarki tampilan, ini diperdebatkan jika tidak mendukung adegan. (Dan untuk menyelesaikan, ya, saya masih agak khawatir. Tapi ini juga beta 5.) Semoga Anda memiliki cadangan yang bagus yang dapat mereproduksi apa yang saya lihat.
dfd
Terima kasih. Saya curiga ada sesuatu dalam siklus hidup. Saya akan menghabiskan waktu untuk men-debug aplikasi saya. Saya akan memperbaruinya setiap kali saya memikirkannya untuk membantu siapa pun yang mengalami situasi serupa
DavidA
5

Saya mendapatkan ini untuk bekerja menggunakan jawaban dfd, tetapi karena aplikasi saya ada di Objective-C, saya harus membuat satu perubahan:

Di Objective-C, Anda ingin meletakkan

@property (strong, nonatomic) UIWindow *window;

di AppDelegate.h (bukan di .m)

Nik Bhatt
sumber
4

Oke jadi saya menemukan jawabannya. Karena perubahan di iOS 13 dari gaya presentasi kartu default baru Apple, di storyboard saya beralih dari layar splash ke pengontrol navigasi aliran kustom saya yang default ke presentasi baru (lihat tangkapan layar di bawah).

Segue

Cara saya memperbaikinya adalah kembali ke gaya lama yang default ke siklus hidup lama. Lihat gambar di bawah.

Jenis papan cerita seque

Tidak yakin mengapa itu terjadi, karena ini adalah satu-satunya tempat di aplikasi saya yang menyebabkan ini (aplikasi yang cukup besar jadi saya harus meluangkan waktu untuk memeriksa semua storyboard untuk memastikannya).

DavidA
sumber
2
Pertanyaan Anda menanyakan bagaimana memilih untuk tidak menggunakan adegan. Jawaban ini tidak memberikan solusi untuk menyisih dari adegan. Ini seharusnya bukan jawaban yang diterima. Jika semua yang ingin Anda lakukan adalah menghindari presentasi gaya kartu baru, Anda dapat menemukan jawaban itu dalam beberapa duplikat yang menjawab pertanyaan itu.
rmaddy
1

Xcode 12 - Swift 5.3 - iOS 14

Sejak Xcode 12 dan dengan bantuan Swift 5.3 dan @main, Anda dapat memiliki aplikasi multiplatform yang tidak memiliki SceneDelegateatau acara AppDelegate. Hanya akan ada file sederhana seperti:

import SwiftUI

@main
struct MyMultiPlatformApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}
Mojtaba Hosseini
sumber