Відмовитися від UISceneDelegate / SwiftUI на iOS


111

Зараз я використовую Xcode 11 Beta 5. У моїй програмі він чудово працює на iOS 12 та старіших версіях. Однак на iOS 13 схоже, що він використовує UISceneза замовчуванням. Це змушує мій додаток нічого не робити.

Коли програма запускається з новою інсталяцією, користувач повинен прийняти умови та умови. Погодившись, вони переходять на екран завантаження, який потім спрямовує їх до головного виду. На скріншоті, який я опублікував, видом за поточним на передньому плані є екран заставки.

Незабаром ми розглянемо можливість додавати підтримку сцени з декількома поданнями, але зараз у нас є матеріали з вищим пріоритетом, над якими нам потрібно працювати.

https://imgur.com/i0qLhAL

"Підтримка декількох вікон" вже вимкнено в загальних налаштуваннях цілі програми. Крім того, у файлі info.plist для параметра Enable Multiple Windows встановлено значення NO.

Поки що насправді нічого не працювало. В основному я хочу відмовитися / вимкнути кілька вікон та UIScene / SwiftUI, щоб відновити початкову поведінку в iOS 10-12. Це можливо в iOS 13 або ми повинні його оновити?

Оновлення:

Ось знімок екрану ієрархії налагодження подання. Лівий бік iOS 12, правий бік iOS 13, не додаючи нічого до Info.plist, ні класів, ні методів делегатів сцен, чому він відрізняється? Практично щойно запустив його в існуючому готовому коді на Xcode 11.

https://imgur.com/C3aLsDo


Вам потрібно підтримувати лише iOS 13 та новіші версії, або вам потрібно підтримувати iOS 13 та iOS 12?
rmaddy

Підтримка @rmaddy між iOS 11-13 + (майбутні версії).
Девід,

Ваш основний інтерфейс через код або розкадрування?
rmaddy

@rmaddy це зроблено в раскадровках, що має посилання на посилання xib ViewControllers.
Девід,

Без конкретних деталей того, що і коли робить ваш додаток, важко сказати. Зверніть увагу, що такі методи контролера перегляду, як, наприклад viewWill|DidAppear, не називаються однаково в iOS 13 під час відмови від представлених контролерів перегляду, наприклад. Додайте безліч повідомлень про налагодження життєвого циклу та точки зупинки та порівняйте потік між iOS 12 та 13 та переконайтеся, що це різниться.
rmaddy

Відповіді:


311

Хоча вам слід охопити використання сцен, коли ваш додаток запущено під iOS 13 та новішими версіями, ви можете повністю відмовитись, поки ви все ще підтримуєте iOS 12 або новішу версію.

  • Повністю видаліть запис “Маніфест сцени програми” із Info.plist.

  • Якщо є клас делегата сцени, видаліть його.

  • Якщо в делегаті програми є якісь методи, пов’язані зі сценою, видаліть ці методи.

  • Якщо його немає, додайте властивість var window: UIWindow?до делегата програми.

Тепер ваш додаток повинен використовувати лише делегат програми, а під iOS 13 він повинен мати той самий життєвий цикл, що і iOS 12.

Примітка: Ніщо з цього не стосується Swift або SwiftUI.


Ми розміщували відповіді одночасно. :-) Одне питання - той відсутній рядок у AppDelegateтому, до якого я звертався. Чи автоматично це повертається в цьому процесі, який ви описали? (Мені більше подобається ваша відповідь, оскільки вона повністю ігнорує сцени.)
dfd

1
Те саме відбувається і зі мною, і в моєму Info.plist у мене немає записів маніфесту, ані методів AppDelegate, а також класу SceneDelegate. Я встановлюю свій контролер як "умови та умови" для Девіда як rootViewController, і він виглядає так само, як показано тут у запитанні вище. Будь ласка, допоможіть, оскільки я застряг у цій помилці в інтерфейсі і не можу рухатися вперед .. тьфу!
Мохсін Хубайб Ахмед,

1
@MohsinKhubaibAhmed Ви запитуєте про зовсім інше питання. Див stackoverflow.com/questions/56435510 / ...
rmaddy

1
Привіт! Я дотримувався інструкцій із трьох кроків, але після появи екрану запуску з’явився чорний екран. Вибрано головну розкадрування, а також контролер початкового перегляду. Чи є у вас пропозиції?
user3191334

1
@ user3191334 Я також отримав чорний екран. У моєму випадку це був темний режим, який давав мені чорний фон за замовчуванням. Додайте трохи вмісту до своєї базової розкадровки, і все з’явиться.
Гордон Голуб

41

Використовуючи відповідь, сподіваємось, форматувати речі краще, ніж коментар. (Не соромтеся коментувати, і я відредагую.)

З цим я теж стикався, і тут є кілька сценаріїв:

  • Якщо ви хочете працювати над існуючимUIKit додатком у Xcode 11, просто відкрийте його, і він повинен працювати нормально. Всі мої програми мають, з НЕ SceneDelegate файл , ніяких - яких змін AppDelegateабо розкадровки.
  • Якщо ви хочете створити нову UIKITпрограму, націлену на iOS 13 , просто створіть її, не переставляючи прапорець "Використовувати SwiftUI".

Але мені цікаво, чи стикаєтесь ви з третім сценарієм - таким, який я зробив близько тижня тому. Створення нової програми `UIKit, націленої на щось раніше, ніж iOS 13 . (Я насправді націлювався на iOS 9!)

Так, ваш шаблон видасть вам 15 помилок (станом на бета-версію 5) разом із SceneDelegateфайлом / класом. На щастя, Xcode допоможе вам автоматично виправити всі, крім одного.

Останній - додати один рядок, який є частиною SceneDelegateкласу, але, на жаль, Apple залишила його поза AppDelegateкласом - що після більш ніж десятка @available(iOS 13.0, *)статей означає, що ви відмовились від SceneDelegateроботи на iOS 12 і вгадайте що? Це НЕ там ApDelegate!

Додайте це до свого AppDelegate:

var window: UIWindow?

На той момент у вас повинна бути запущена UIKitпрограма, орієнтована на iOS 12 та новіші версії.


Дякую за це. Мій сценарій - це майже перший момент, про який ви сказали, існуюча програма UIKit у Xcode 11. Але коли я її відкриваю, це не працює нормально. Подивіться на оновлення, яке я додав, ієрархії налагодження подання.
Девід,

Також у AppDelegate він уже має вікно var: UIWindow?
Девід,

Ви мене турбували! (І я все ще трохи переживаю.) Я дуже мало оновлював свої існуючі програми - минулого тижня було розчарування у SwiftUI, і мені було цікаво спробувати макет в UIKit лише для iOS 13. Але мої наявні програми? Вони підтримують багатозадачність iPad, але залишені без змін у Xcode 11 У мене немає, SceneDelegateі тестування навколо говорить (а), що вони працюють в iOS 13, і (б) вони взагалі не підтримують кілька вікон, просто розділіть подання між двома програмами. (Я також не підтримую перетягування.) Щось ще відбувається у вас?
dfd

Повторюся, я просто відкрив свою програму Xcode 10 у Xcode 11. Ні SceneDelegate, ні SwiftUI, немає можливості створювати кілька екземплярів своїх додатків iOS 9+. Продуктивність така ж, як завжди - всі вони є CoreImageвласними фільтрами, які оновлюються в режимі реального часу - і, ну, для мене? Якщо в ієрархії подання є деяка проблема, пов’язана з ОС, пов’язана зі сценами, це спорне питання, якщо не підтримує сцени. (І на закінчення, так, я все ще трохи стурбований. Але це також бета-версія 5.) Сподіваємось, у вас є хороша резервна копія, яка може відтворити те, що я бачу.
dfd

Дякую. Я підозрюю, що це щось у життєвому циклі. Я витрачу час на налагодження моєї програми. Я оновлюватиму це щоразу, коли
з’ясую

5

Я змусив це працювати, використовуючи відповідь dfd, але оскільки мій додаток знаходиться в Objective-C, мені довелося зробити одну зміну:

У Objective-C ви хочете помістити

@property (strong, nonatomic) UIWindow *window;

в AppDelegate.h (не в .m)


4

Гаразд, я зрозумів це. Через зміни в iOS 13 нового стилю презентації карток Apple за замовчуванням, у моїй раскадровці перехід від мого екрана заставки до мого користувальницького контролера навігації потоком за замовчуванням став новою презентацією (див. Знімок екрана нижче).

Segue

Як я це виправив, це повернення до старого стилю, який не відповідав старому життєвому циклу. Дивіться знімок екрана нижче.

Розкадровка секве вид

Не знаю, чому це сталося, оскільки це було єдиним місцем у моїй програмі, яке спричинило це (досить великий додаток, тому мені доведеться витратити певний час, переглядаючи всі розкадровки, щоб переконатися).


2
Ваше запитання задає питання, як відмовитись від використання сцен. Ця відповідь не пропонує рішення щодо відмови від сцен. Це не повинно бути прийнятою відповіддю. Якщо все, що ви хотіли зробити, - це уникнути презентації у стилі нової картки, ви могли б знайти цю відповідь у кількох примірниках, що стосується цього питання.
rmaddy

1

Xcode 12 - Swift 5.3 - iOS 14

Починаючи з Xcode 12 та за допомогою Swift 5.3 та @main, ви можете мати мультиплатформену програму, яка не має SceneDelegateподії або події AppDelegate. Буде лише простий файл, такий як:

import SwiftUI

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

Фактично помилковий більш ніж одним чином. Перше: Swift 5.3 не буде включено до Xcode 11, це частина майбутнього випуску Xcode 12. По-друге: декоратор @main, а також протокол програми та WindowGroup підтримуються лише для SwiftUI 2.0 на iOS14 - тому ця відповідь не спрацює для операційної системи, навіть якби вони могли зараз використовувати Swift 5.3 на iOS13.
Ширкін
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.