IOS पर UISceneDelegate / SwiftUI से ऑप्ट आउट करें


111

मैं वर्तमान में Xcode 11 Beta 5 का उपयोग कर रहा हूं। मेरे आवेदन के भीतर, यह iOS 12 और उससे कम पर चलता है। हालाँकि, iOS 13 पर ऐसा लगता है कि यह UISceneडिफ़ॉल्ट रूप से उपयोग कर रहा है। यह मेरे ऐप को कुछ नहीं करने के लिए प्रेरित कर रहा है।

जब ऐप नए इंस्टॉल पर लॉन्च होता है, तो उपयोगकर्ता को स्वीकार करना चाहिए एक नियम और शर्तें हैं। सहमत होने के बाद वे एक लोडिंग स्क्रीन पर जाते हैं जो फिर उन्हें मुख्य दृश्य में ले जाता है। मेरे द्वारा पोस्ट किए गए स्क्रीनशॉट में, अग्रभूमि में वर्तमान एक के पीछे का दृश्य स्प्लैश लोडिंग स्क्रीन है।

हम जल्द ही पूरे एप्लीकेशन में कई व्यू व्यू सपोर्ट जोड़ने का प्रयास करेंगे, लेकिन अभी हमारे पास उच्च प्राथमिकता वाले सामान हैं जिन पर हमें काम करने की आवश्यकता है।

https://imgur.com/i0qLhAL

"समर्थन कई विंडो" ऐप के लक्ष्य की सामान्य सेटिंग्स में पहले से ही अक्षम है। इसके अलावा, मैं info.plist फ़ाइल में कई विंडोज सेट करने के लिए सक्षम है।

अब तक वास्तव में कुछ भी काम नहीं किया है। मूल रूप से मैं iOS 10-12 में मूल व्यवहार को पुनर्स्थापित करने के लिए कई विंडो और UIScene / SwiftUI को चुनना / अक्षम करना चाहता हूं। क्या यह iOS 13 में संभव है या हमें इसे अपडेट करना है?

अपडेट करें:

यहाँ डिबग पदानुक्रम के दृश्य का एक स्क्रीनशॉट है। बाईं ओर iOS 12 है, दाईं ओर iOS 13. है। Info.plist और न ही किसी दृश्य प्रतिनिधि वर्गों या विधियों में कुछ जोड़े बिना, यह अलग क्यों है? बहुत ज्यादा सिर्फ Xcode 11 पर अपने मौजूदा उत्पादन तैयार कोड में इसे चलाया।

https://imgur.com/C3aLsDo


क्या आपको केवल iOS 13 और बाद के संस्करण का समर्थन करने की आवश्यकता है या क्या आपको iOS 13 और iOS 12 का समर्थन करने की आवश्यकता है?
rammdy

iOS 11-13 + (भविष्य के संस्करण) के बीच @rmaddy समर्थन।
डेविड

क्या आपका मुख्य UI कोड या स्टोरीबोर्ड के माध्यम से है?
rammdy

स्टोरीबोर्ड्स में किया गया @rmaddy का एक संदर्भ है कि यह xib ViewControllers को संदर्भित करता है।
डेविड एएए

आपका ऐप क्या कर रहा है और कब, इस बारे में विशेष विवरण के बिना, यह बताना मुश्किल है। ध्यान दें कि viewWill|DidAppearउदाहरण के तौर पर प्रस्तुत व्यू कंट्रोलर्स को खारिज करते समय नियंत्रक विधियों जैसे कि iOS 13 में इसे नहीं कहा जाता है। बहुत सारे जीवनचक्र डिबगिंग संदेश और ब्रेकप्वाइंट जोड़ें और iOS 12 और 13 के बीच प्रवाह की तुलना करें और देखें कि यह कहां भिन्न है।
रामादेवी

जवाबों:


311

जब आपको अपने ऐप को iOS 13 और बाद में चलाने के दौरान दृश्यों का उपयोग करना चाहिए , तो आप पूरी तरह से ऑप्ट आउट कर सकते हैं जब आप अभी भी iOS 12 या उससे पहले का समर्थन करते हैं।

  • Info.plist से "एप्लिकेशन दृश्य मैनिफेस्ट" प्रविष्टि को पूरी तरह से हटा दें।

  • यदि कोई दृश्य प्रतिनिधि वर्ग है, तो उसे हटा दें।

  • यदि आपके एप्लिकेशन प्रतिनिधि में कोई दृश्य संबंधित विधियां हैं, तो उन विधियों को हटा दें।

  • यदि गुम है, तो संपत्ति var window: UIWindow?को अपने एप्लिकेशन प्रतिनिधि में जोड़ें।

आपके ऐप को अब केवल ऐप प्रतिनिधि का उपयोग करना चाहिए और iOS 13 के तहत इसमें iOS 12 के समान ही जीवन चक्र होना चाहिए।

नोट: इसमें से कोई भी स्विफ्ट या स्विफ्टयूआई के लिए विशिष्ट नहीं है।


हमने उसी समय उत्तर पोस्ट कर दिए। :-) एक सवाल - उस लापता रेखा को AppDelegateमैंने संबोधित किया। क्या यह स्वचालित रूप से आपके द्वारा वर्णित प्रक्रिया में वापस आता है? (मैं आपके उत्तर को बेहतर पसंद करता हूं, क्योंकि यह पूरी तरह से दृश्यों की अवहेलना करता है।)
dfd

1
वही मेरे लिए हो रहा है और मेरी Info.plist में न तो कोई एंट्री है और न ही कोई AppDelegate तरीके और न ही कोई SceneDoggate क्लास। मैं डेविड के लिए rootViewController के रूप में "नियम और शर्तें" जैसे अपने नियंत्रक को सेट कर रहा हूं और यह ऊपर दिए गए प्रश्न में यहां दिखाया गया है। कृपया मदद के रूप में मैं इस UI गड़बड़ और खिचड़ी भाषा के साथ फंस गया हूँ .. आगे!
मोहसिन खुब्बीब अहमद

1
@MohsinKhubaibAhmed आप एक पूरी तरह से अलग मुद्दे के बारे में पूछ रहे हैं। देखें stackoverflow.com/questions/56435510/...
rmaddy

1
नमस्ते! मैंने 3-चरण-निर्देश का पालन किया, लेकिन लॉन्च स्क्रीन दिखाई देने के बाद एक काली स्क्रीन मिली। मुख्य स्टोरीबोर्ड चयनित है और प्रारंभिक दृश्य नियंत्रक भी है। क्या तुम्हारे पास कोई सुझाव है?
user3191334

1
@ user3191334 मुझे ब्लैक स्क्रीन भी मिली। मेरे मामले में यह डार्क मोड था जो मुझे एक डिफ़ॉल्ट ब्लैक बैकग्राउंड देता था। अपने आधार स्टोरीबोर्ड में कुछ सामग्री जोड़ें और सभी दिखाई देंगे।
गॉर्डन कबूतर

41

किसी टिप्पणी से बेहतर ढंग से चीजों को प्रारूपित करने के लिए उत्तर का उपयोग करना। (टिप्पणी के लिए स्वतंत्र महसूस करें और मैं संपादित करूंगा।)

यह कुछ ऐसा है जिसका मैंने सामना किया है, और यहां कुछ परिदृश्य हैं:

  • यदि आप Xcode 11 में किसी मौजूदाUIKit ऐप पर काम करना चाहते हैं , तो बस इसे खोलें और इसे ठीक काम करना चाहिए। मेरे सभी ऐप्स में कोई SceneDelegate फ़ाइल नहीं है और न ही AppDelegateया स्टोरीबोर्ड में कोई परिवर्तन है ।
  • यदि आप iOS 13 को लक्षित करते हुए एक नया UIKITऐप बनाना चाहते हैं , तो यह सुनिश्चित करते हुए कि आप "Use SwiftUI" चेकबॉक्स को अनियंत्रित छोड़ दें।

लेकिन मैं सोच रहा हूं कि क्या आप तीसरे परिदृश्य का सामना कर रहे हैं - एक जो मैंने लगभग एक सप्ताह पहले किया था। IOS 13 के मुकाबले कुछ नया `UIKit ऐप बनाना । (मैंने वास्तव में iOS 9 को लक्षित किया है!)

हां, आपका टेम्प्लेट आपको SceneDelegateफ़ाइल / कक्षा के साथ 15 त्रुटियां (बीटा 5 के रूप में) देगा । सौभाग्य से, Xcode आपको ऑटो लेकिन सभी को सही करने में मदद करेगा।

अंतिम एक लाइन को जोड़ना है जो SceneDelegateकक्षा का हिस्सा है लेकिन दुर्भाग्य से Apple ने इसे AppDelegateकक्षा से बाहर कर दिया - जो एक दर्जन से अधिक @available(iOS 13.0, *)खंडों के बाद का अर्थ है कि आपने SceneDelegateiOS 12 चलाने का विकल्प छोड़ दिया है और क्या अनुमान लगा रहे हैं? यह वहाँ नहीं है ApDelegate!

इसे अपने AppDelegate में जोड़ें:

var window: UIWindow?

उस समय, आपके पास UIKitiOS 12 और उससे पहले के लिए चलने वाला ऐप होना चाहिए ।


इसके लिए धन्यवाद। मेरा परिदृश्य बहुत ही पहला बिंदु है जो आपने कहा था, एक मौजूदा UIKit ऐप Xcode 11 में। लेकिन जब मैं इसे खोलता हूं, तो यह ठीक काम नहीं करता है। अद्यतन मैं डीबग पदानुक्रम के दृश्य में देखें।
डेविड

इसके अलावा AppDelegate में, पहले से ही var विंडो है: UIWindow?
डेविड आउ

तुम मुझे चिंतित था! (और मैं अभी भी थोड़ा चिंतित हूं।) मैंने अपने मौजूदा ऐप के लिए बहुत कम अपडेट किया है - पिछले हफ्ते स्विफ्टयूआई के साथ निराशा थी और मैं केवल iOS 13 के लिए UIKit में एक लेआउट की कोशिश करने के बारे में उत्सुक था। लेकिन मेरे मौजूदा ऐप्स? वे iPad मल्टी-टास्किंग का समर्थन करते हैं, लेकिन Xcode 11 में अपरिवर्तित छोड़ दिया गया है मेरे पास कोई SceneDelegateपरीक्षण नहीं है और कहता है (a) वे iOS 13 में काम करते हैं और (b) वे कई विंडोज़ का समर्थन नहीं करते हैं, बस दो ऐप के बीच में विभाजन देखें। (मैं भी ड्रैग-एंड-ड्रॉप का समर्थन नहीं करता।) क्या आपके अंत में कुछ और चल रहा है?
dfd

दोहराने के लिए, मैंने Xcode 11 में अपना Xcode 10 ऐप केवल 11 में खोला। नहीं SceneDelegate, नहीं SwiftUI, मेरे iOS 9+ ऐप्स के कई इंस्टेंस बनाने की क्षमता नहीं है। प्रदर्शन हमेशा की तरह ही है - वे सभी CoreImageवास्तविक समय में अपडेट करने वाले कस्टम फ़िल्टर हैं - और, ठीक है, मेरे लिए? यदि दृश्य पदानुक्रम में दृश्यों से संबंधित कुछ OS से संबंधित cruft है, यदि यह दृश्यों का समर्थन नहीं करता है, तो यह लूट है। (और खत्म करने के लिए, हाँ, मैं अभी भी थोड़ा चिंतित हूं। लेकिन यह बीटा 5 भी है।) उम्मीद है कि आपके पास एक अच्छा बैकअप है जो मैं देख रहा हूं, उसे पुन: उत्पन्न कर सकता हूं।
dfd

धन्यवाद। मुझे जीवनचक्र के भीतर इसकी किसी चीज पर संदेह है। मैं अपना आवेदन डिबग करने में समय बिताऊंगा। जब भी मैं एक समान स्थिति में किसी की मदद करने के लिए इसका पता
डेविड

5

मुझे यह dfd के उत्तर का उपयोग करके काम करने के लिए मिला, लेकिन क्योंकि मेरा ऐप ऑब्जेक्टिव-सी में है, इसलिए मुझे एक बदलाव करना पड़ा:

ऑब्जेक्टिव-सी में, आप डालना चाहते हैं

@property (strong, nonatomic) UIWindow *window;

AppDelegate.h में (.m में नहीं)


4

ठीक है, इसलिए मैंने इसका पता लगाया। Apple के नए डिफॉल्ट कार्ड प्रेजेंटेशन स्टाइल के iOS 13 में बदलाव के कारण, मेरी स्टोरीबोर्ड में मेरी स्पलैश स्क्रीन से लेकर मेरे कस्टम फ्लो नेविगेशन कंट्रोलर तक नई प्रस्तुति के लिए डिफॉल्ट हुआ (नीचे स्क्रीनशॉट देखें)।

Segue

मैंने कैसे तय किया कि पुरानी शैली को वापस जाना है जो पुराने जीवनचक्र को डिफ़ॉल्ट बनाता है। नीचे स्क्रीनशॉट देखें

स्टोरीबोर्ड seque तरह

यकीन नहीं होता कि ऐसा क्यों किया गया, क्योंकि मेरे आवेदन में यह एकमात्र स्थान था, जो इसका कारण था (बहुत बड़ा ऐप इसलिए मुझे कुछ समय बिताने के लिए सभी स्टोरीबोर्ड से गुजरना पड़ता है)।


2
आपका प्रश्न पूछता है कि दृश्यों का उपयोग कैसे करना है। यह उत्तर दृश्यों से बाहर निकलने का समाधान प्रदान नहीं करता है। यह स्वीकृत उत्तर नहीं होना चाहिए। यदि आप सभी नई कार्ड-शैली प्रस्तुति से बचना चाहते थे, तो आप उस प्रश्न को संबोधित करने वाले कई डुप्लिकेट में उत्तर पा सकते थे।
रामपाल

1

Xcode 12 - स्विफ्ट 5.3 - iOS 14

चूंकि Xcode 12 और स्विफ्ट 5.3 की मदद से और @main, आपके पास एक मल्टीप्लाकॉर्डर ऐप हो सकता है जिसमें कोई SceneDelegateघटना या घटना नहीं है AppDelegate। केवल एक साधारण फ़ाइल होगी:

import SwiftUI

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

एक से अधिक तरीकों से तथ्यात्मक रूप से गलत। पहला: स्विफ्ट 5.3 को Xcode 11 में शामिल नहीं किया जाएगा, यह आगामी Xcode 12 रिलीज़ का हिस्सा है। दूसरा: @main डेकोरेटर और साथ ही App प्रोटोकॉल और WindowGroup केवल iOS14 पर SwiftUI 2.0 के लिए समर्थित हैं - इसलिए यह उत्तर OP के लिए काम नहीं करेगा, भले ही वे अभी iOS13 पर Swift 5.3 का उपयोग कर सकते हैं।
शिरकिन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.