İOS'ta UISceneDelegate / SwiftUI'yi devre dışı bırakın


129

Şu anda Xcode 11 Beta 5 kullanıyorum. Uygulamam içinde iOS 12 ve altında sorunsuz çalışıyor. Ancak, iOS 13'te UIScenevarsayılan olarak kullanıyor gibi görünüyor . Bu, uygulamamın hiçbir şey yapmamasına neden oluyor.

Uygulama yeni yüklemede başladığında, kullanıcının kabul etmesi gereken bir şartlar ve koşullar vardır. Kabul ettikten sonra bir yükleme ekranına giderler ve bu ekran onları ana görünüme yönlendirir. Yayınladığım ekran görüntüsünde, ön plandaki mevcut görüntünün arkasındaki görünüm, sıçrama yükleme ekranı.

Yakında uygulama boyunca birden fazla görünüm sahne desteği eklemeye bakacağız, ancak şu anda üzerinde çalışmamız gereken daha yüksek öncelikli şeylere sahibiz.

https://imgur.com/i0qLhAL

"Birden çok pencereyi destekle", uygulamanın hedefinin Genel ayarlarında zaten devre dışı bırakılmıştır. Ayrıca, info.plist dosyasında Çoklu Windows'u Etkinleştir ayarını HAYIR olarak ayarladım.

Şimdiye kadar hiçbir şey gerçekten işe yaramadı. Temel olarak, iOS 10-12'deki orijinal davranışı geri yüklemek için birden çok pencereyi ve UIScene / SwiftUI'yi devre dışı bırakmak / devre dışı bırakmak istiyorum. Bu iOS 13'te mümkün mü yoksa güncellememiz gerekiyor mu?

Güncelleme:

İşte hata ayıklama hiyerarşisinin bir ekran görüntüsü. Sol taraf iOS 12, sağ taraf iOS 13'tedir. Info.plist'e herhangi bir sahne veya temsilci sınıfları veya yöntemleri eklemeden, neden farklı? Hemen hemen Xcode 11'deki mevcut üretime hazır kodunda çalıştırdı.

https://imgur.com/C3aLsDo


Yalnızca iOS 13 ve sonraki sürümleri desteklemeniz mi gerekiyor yoksa iOS 13 ve iOS 12'yi desteklemeniz mi gerekiyor?
rmaddy

iOS 11-13 + (gelecekteki sürümler) arasında @rmaddy desteği.
Davida

Ana kullanıcı arayüzünüz kod veya film şeridi aracılığıyla mı?
rmaddy

@rmaddy, storyboard'larda yapılır, referans alınan xib ViewControllers'ın bir bölümü vardır.
Davida

Uygulamanızın ne yaptığı ve ne zaman yaptığı hakkında belirli ayrıntılar olmadan söylemek zor. viewWill|DidAppearÖrneğin, sunulan görünüm denetleyicileri kapatılırken iOS 13'te görüntüleme denetleyicisi yöntemlerinin aynı şekilde adlandırılmadığını unutmayın. Çok sayıda yaşam döngüsü hata ayıklama mesajı ve kesme noktası ekleyin ve iOS 12 ile 13 arasındaki akışı karşılaştırın ve nerede farklı olduğunu görün.
rmaddy

Yanıtlar:


352

Eğer iken gerektiğini uygulama iOS 13 altında çalışacak ve daha sonra zaman sahneleri kullanarak benimsemesi hala iOS 12 veya daha önceki destek vermekle birlikte, tamamen devre dışı bırakabilirler.

  • Info.plist'ten “Uygulama Sahnesi Manifest” girişini tamamen kaldırın.

  • Bir sahne temsilcisi sınıfı varsa, onu kaldırın.

  • Uygulama temsilcinizde sahneyle ilgili herhangi bir yöntem varsa, bu yöntemleri kaldırın.

  • Eksikse, mülkü var window: UIWindow?uygulama temsilcinize ekleyin .

Uygulamanız artık yalnızca uygulama temsilcisini kullanmalı ve iOS 13 altında iOS 12 ile aynı yaşam döngüsüne sahip olmalıdır.

Not: Bunların hiçbiri Swift veya SwiftUI'ye özgü değildir.


Cevapları aynı anda yayınladık. :-) Bir soru - AppDelegateele aldığım o eksik satır . Bu tarif ettiğiniz süreçte otomatik olarak geri geliyor mu? (Sahneleri tamamen göz ardı ettiği için cevabınızı daha çok
beğeniyorum

1
Aynı şey benim için de oluyor ve Info.plist'imde herhangi bir AppDelegate yöntemi ve ayrıca SceneDelegate sınıfı da yok. Denetleyicimi David için "şartlar ve koşullar" gibi rootViewController olarak ayarlıyorum ve yukarıdaki soruda gösterilenle aynı görünüyor. Bu kullanıcı arayüzü sorununa takılıp kaldığım ve ilerleyemediğim için lütfen yardım edin .. ugh!
Mohsin Khubaib Ahmed

1
@MohsinKhubaibAhmed Bambaşka bir konu hakkında soru soruyorsunuz. Stackoverflow.com/questions/56435510/… sayfasına
rmaddy

1
Merhaba! 3 adımlı talimatı takip ettim ancak başlatma ekranı göründükten sonra siyah bir ekran aldım. Ana Öykü Panosu ve ayrıca ilk görünüm denetleyicisi seçilir. Önerin var mı?
user3191334

1
@ user3191334 Siyah ekranı da aldım. Benim durumumda, bana varsayılan siyah arka plan veren karanlık moddu. Temel film şeridinize biraz içerik ekleyin ve hepsi görünecektir.
Gordon Dove

42

Yanıtı, şeyleri yorumdan daha iyi biçimlendirmek için kullanmak. (Yorum yapmaktan çekinmeyin, ben düzenleyeceğim.)

Bu benim de karşılaştığım bir şey ve burada oynanacak birkaç senaryo var:

  • Mevcut bir üzerinde çalışmak istiyorsanızUIKitXcode 11'de uygulama , onu açmanız yeterlidir ve iyi çalışmalıdır. Tüm uygulamalarım ile, sahip hiçbir SceneDelegate dosyaya ne de herhangi bir değişiklik AppDelegateveya storyboard'lar.
  • Bir oluşturmak isterseniz yeni UIKITiOS 13 hedefleme app emin kontrolsüz "Kullanım SwiftUI" onay kutusunu bırakın yaparken, basitçe oluşturun.

Ama merak ediyorum, yaklaşık bir hafta önce yaptığım üçüncü senaryo ile karşı karşıyasınız. İOS 13'ten önceki bir şeyi hedefleyen yeni bir UIKit uygulaması oluşturma . (Aslında iOS 9'u hedefledim!)

Evet, şablonunuz size bir SceneDelegatedosya / sınıfla birlikte 15 hata (beta 5 itibariyle) verecektir . Neyse ki Xcode, biri dışında tümünü otomatik olarak düzeltmenize yardımcı olacaktır.

Sonuncusu, SceneDelegatesınıfın bir parçası olan bir satır eklemektir, ancak ne yazık ki Apple onu AppDelegatesınıfın dışında bıraktı - bu, bir düzineden fazla @available(iOS 13.0, *)cümlenin ardından SceneDelegateiOS 12 çalıştırıyorsanız devre dışı bıraktığınız anlamına gelir ve tahmin edin ne oldu? O var değil orada ApDelegate!

Bunu AppDelegate'inize ekleyin:

var window: UIWindow?

Bu noktada, UIKitiOS 12 ve öncesi için hedeflenen çalışan bir uygulamanız olmalıdır .


Bunun için teşekkürler. Senaryom, söylediğiniz ilk nokta, Xcode 11'de mevcut bir UIKit uygulamasıdır. Ancak onu açtığımda, düzgün çalışmıyor. Görünüm hata ayıklama hiyerarşisi için eklediğim güncellemeye bakın.
Davida

Ayrıca AppDelegate'te zaten var penceresi var: UIWindow?
Davida

Beni endişelendirdin! (Ve hala biraz endişeliyim.) Mevcut uygulamalarım için çok az güncelleme yaptım - geçen hafta SwiftUI ile ilgili hayal kırıklığıydı ve yalnızca iOS 13 için UIKit'te bir düzen denemeyi merak ediyordum. Ama mevcut uygulamalarım? İPad çoklu görevini destekliyorlar ancak Xcode 11'de değişmeden kaldım SceneDelegateve etrafta test ettim diyor ki (a) iOS 13'te çalışıyorlar ve (b) birden fazla pencereyi desteklemiyorlar, sadece iki uygulama arasında bölünmüş görünümü. (Ayrıca sürükle ve bırak özelliğini de desteklemiyorum.) Sizin tarafınızda başka bir şey mi var?
dfd

Tekrarlamak gerekirse, Xcode 10 uygulamamı Xcode 11'de açtım. Hayır SceneDelegate, hayır SwiftUI, iOS 9+ uygulamalarımın birden fazla örneğini oluşturma yeteneği yok. Performans her zamanki gibi - hepsi CoreImagegerçek zamanlı olarak güncellenen özel filtreler - ve benim için peki? Görünüm hiyerarşisindeki sahnelerle ilgili işletim sistemi ile ilgili bazı aksaklıklar varsa, sahneleri desteklemiyorsa bu tartışmalıdır. (Ve bitirmek için, evet, hala biraz endişeliyim. Ama aynı zamanda beta 5.) Umarım gördüklerimi yeniden üretebilecek iyi bir yedeğiniz vardır.
dfd

Teşekkürler. Yaşam döngüsü içinde bir şey olduğundan şüpheleniyorum. Başvurumda hata ayıklamak için zaman harcayacağım. Benzer bir durumda olan birine yardım etmek için ne zaman
bulursam

8

Bunu dfd'nin cevabını kullanarak çalıştırdım, ancak uygulamam Objective-C'de olduğu için bir değişiklik yapmam gerekti:

Objective-C'ye koymak istiyorsunuz

@property (strong, nonatomic) UIWindow *window;

AppDelegate.h'de (.m değil)


4

Tamam, ben de anladım. Apple'ın yeni varsayılan kart sunum stilinin iOS 13'teki değişiklikler nedeniyle, film şeridim açılış ekranımdan varsayılan olarak yeni sunuma ayarlanmış özel akış gezinme denetleyicime geçiyor (aşağıdaki ekran görüntüsüne bakın).

Segue

Bunu nasıl düzelttim, eski yaşam döngüsüne varsayılan olan eski stile geri dönmekti. Aşağıdaki ekran görüntüsüne bakın.

Storyboard sıralı tür

Neden yaptığından emin değilim, çünkü uygulamamda buna neden olan tek yer buydu (oldukça büyük bir uygulama, bu yüzden emin olmak için tüm storyboard'lardan geçmek için biraz zaman harcamak zorundayım).


2
Sorunuz sahneleri kullanmayı nasıl iptal edeceğinizi soruyor. Bu cevap, sahneleri devre dışı bırakmak için bir çözüm sağlamaz. Kabul edilen cevap bu olmamalı. Yapmak istediğiniz tek şey yeni kart tarzı sunumdan kaçınmak olsaydı, bu yanıtı bu soruyu ele alan birkaç kopya halinde bulabilirdiniz.
rmaddy

1

Xcode 12 - Swift 5.3 - iOS 14

Xcode 12'den beri ve Swift 5.3 ve yardımıyla @main, hiç SceneDelegateveya etkinliği olmayan bir çoklu platform uygulamasına sahip olabilirsiniz AppDelegate. Yalnızca aşağıdaki gibi basit bir dosya olacaktır:

import SwiftUI

@main
struct MyMultiPlatformApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.