เลือกไม่ใช้ UISceneDelegate / SwiftUI บน iOS


129

ฉันกำลังใช้ Xcode 11 Beta 5 ในแอปพลิเคชันของฉันมันทำงานได้ดีบน iOS 12 และต่ำกว่า อย่างไรก็ตามใน iOS 13 ดูเหมือนว่าจะใช้UISceneโดยค่าเริ่มต้น นี่ทำให้แอปของฉันไม่ทำอะไรเลย

เมื่อแอปเปิดตัวเมื่อติดตั้งใหม่จะมีข้อกำหนดและเงื่อนไขที่ผู้ใช้ต้องยอมรับ หลังจากตกลงแล้วให้ไปที่หน้าจอโหลดซึ่งจะนำพวกเขาไปยังมุมมองหลัก ในภาพหน้าจอที่ฉันโพสต์มุมมองด้านหลังภาพปัจจุบันเบื้องหน้าคือหน้าจอการโหลดสแปลช

เราจะพิจารณาเพิ่มการรองรับฉากหลายมุมมองตลอดทั้งแอปพลิเคชันเร็ว ๆ นี้ แต่ตอนนี้เรามีสิ่งที่มีลำดับความสำคัญสูงกว่าที่เราต้องดำเนินการ

https://imgur.com/i0qLhAL

"รองรับหลายหน้าต่าง" ถูกปิดใช้งานแล้วในการตั้งค่าทั่วไปของเป้าหมายของแอป นอกจากนี้ฉันได้ตั้งค่า Enable Multiple Windows เป็น NO ในไฟล์ info.plist

จนถึงขณะนี้ไม่มีอะไรได้ผลจริงๆ โดยทั่วไปฉันต้องการเลือกไม่ / ปิดการใช้งานหลาย ๆ หน้าต่างและ 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 + (เวอร์ชันอนาคต)
DavidA

UI หลักของคุณผ่านโค้ดหรือสตอรี่บอร์ดหรือไม่?
rmaddy

@rmaddy เสร็จแล้วในสตอรีบอร์ดมีส่วนต่อเนื่องจาก xib ViewControllers อ้างอิง
DavidA

หากไม่มีรายละเอียดที่เฉพาะเจาะจงว่าแอปของคุณกำลังทำอะไรและเมื่อใดก็ยากที่จะบอกได้ โปรดทราบว่าวิธีการดูตัวควบคุมเช่นviewWill|DidAppearจะไม่เรียกว่าเหมือนกันใน iOS 13 เมื่อปิดตัวควบคุมมุมมองที่นำเสนอตัวอย่างเช่น เพิ่มข้อความการแก้ไขจุดบกพร่องและจุดพักตลอดอายุการใช้งานจำนวนมากและเปรียบเทียบขั้นตอนระหว่าง iOS 12 และ 13 และดูว่าแตกต่างกันตรงไหน
rmaddy

คำตอบ:


352

ในขณะที่คุณควรใช้ฉากต่างๆเมื่อแอปของคุณทำงานภายใต้ iOS 13 ขึ้นไป แต่คุณสามารถเลือกไม่ใช้ได้ทั้งหมดในขณะที่คุณยังรองรับ iOS 12 หรือก่อนหน้า

  • ลบรายการ“ Application Scene Manifest” ออกจาก Info.plist โดยสิ้นเชิง

  • ถ้ามีคลาสตัวแทนของฉากให้ลบออก

  • หากมีวิธีการที่เกี่ยวข้องกับฉากใด ๆ ในตัวแทนแอปของคุณให้ลบวิธีการเหล่านั้นออก

  • หากไม่มีให้เพิ่มคุณสมบัติvar window: UIWindow?ให้กับผู้แทนแอปของคุณ

ตอนนี้แอปของคุณควรใช้เฉพาะตัวแทนของแอปและภายใต้ iOS 13 ควรมีวงจรชีวิตเช่นเดียวกับ iOS 12

หมายเหตุ:ไม่มีสิ่งนี้เฉพาะสำหรับ Swift หรือ SwiftUI


เราโพสต์คำตอบไปพร้อม ๆ กัน :-) คำถามหนึ่ง - บรรทัดที่ขาดหายไปในAppDelegateที่ฉันพูด สิ่งนี้จะกลับมาโดยอัตโนมัติในกระบวนการที่คุณอธิบายไว้หรือไม่ (ฉันชอบคำตอบของคุณดีกว่าเพราะมันไม่สนใจฉากโดย
สิ้นเชิง

1
สิ่งเดียวกันกำลังเกิดขึ้นสำหรับฉันและฉันไม่มีรายการรายการใน Info.plist ของฉันทั้งเมธอด AppDelegate และไม่มีคลาส SceneDelegate ฉันกำลังตั้งค่าตัวควบคุมของฉันเช่น "ข้อกำหนดและเงื่อนไข" สำหรับ David เป็น rootViewController และมันก็ปรากฏขึ้นเช่นเดียวกับที่แสดงไว้ที่นี่ในคำถามด้านบน โปรดช่วยด้วยเนื่องจากฉันติดอยู่กับ UI ที่ผิดพลาดและไม่สามารถก้าวต่อไปได้ .. ฮึ!
Mohsin Khubaib Ahmed

1
@MohsinKhubaibAhmed คุณกำลังถามเกี่ยวกับปัญหาที่แตกต่างไปจากเดิมอย่างสิ้นเชิง ดูstackoverflow.com/questions/56435510/…
rmaddy

1
สวัสดี! ฉันทำตามคำแนะนำ 3 ขั้นตอน แต่มีหน้าจอเป็นสีดำหลังจากที่หน้าจอเรียกใช้งานปรากฏขึ้น กระดานเรื่องราวหลักถูกเลือกและตัวควบคุมมุมมองเริ่มต้นด้วย คุณมีข้อเสนอแนะใด?
user3191334

1
@ user3191334 ผมจอดำด้วย ในกรณีของฉันมันเป็นโหมดมืดทำให้ฉันมีพื้นหลังสีดำเริ่มต้น เพิ่มเนื้อหาบางส่วนในสตอรีบอร์ดฐานของคุณและทั้งหมดจะปรากฏขึ้น
Gordon Dove

42

การใช้คำตอบเพื่อหวังว่าจะจัดรูปแบบสิ่งต่างๆได้ดีกว่าความคิดเห็น (อย่าลังเลที่จะแสดงความคิดเห็นและฉันจะแก้ไข)

นี่คือสิ่งที่ฉันเผชิญเช่นกันและมีบางสถานการณ์ที่เล่นอยู่ที่นี่:

  • หากคุณต้องการทำงานกับแอพที่มีอยู่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 แต่เมื่อฉันเปิดขึ้นมามันก็ไม่ได้ผล ดูการอัปเดตที่ฉันเพิ่มของลำดับชั้นการแก้ไขข้อบกพร่องของมุมมอง
DavidA

นอกจากนี้ใน AppDelegate ยังมีหน้าต่าง var: UIWindow?
DavidA

คุณทำให้ฉันกังวล! (และฉันก็ยังกังวลอยู่บ้าง) ฉันได้อัปเดตแอปที่มีอยู่น้อยมาก - เมื่อสัปดาห์ที่แล้วมีปัญหากับ SwiftUI และฉันอยากรู้อยากเห็นเกี่ยวกับการลองใช้เลย์เอาต์ใน UIKit สำหรับ iOS 13 เท่านั้น แต่แอพที่มีอยู่ของฉันล่ะ? พวกเขารองรับ iPad multi-tasking แต่ไม่เปลี่ยนแปลงใน Xcode 11 ฉันไม่มีSceneDelegateและการทดสอบบอกว่า (ก) ทำงานใน iOS 13 และ (b) ไม่รองรับหลายหน้าต่างเลยเพียงแบ่งมุมมองระหว่างสองแอพ (ฉันไม่รองรับการลากแล้วปล่อยด้วย) มีอะไรเกิดขึ้นอีกไหม
dfd

ในการทำซ้ำฉันเพียงแค่เปิดแอป Xcode 10 ใน Xcode 11 ไม่SceneDelegateไม่SwiftUIไม่สามารถสร้างแอป iOS 9+ ของฉันได้หลายอินสแตนซ์ ประสิทธิภาพยังคงเหมือนเดิม - ทั้งหมดนี้เป็นCoreImageตัวกรองแบบกำหนดเองที่อัปเดตแบบเรียลไทม์ - และสำหรับฉันแล้ว? หากมี OS บางส่วนที่เกี่ยวข้องกับฉากในลำดับชั้นของมุมมองจะเป็นการสงสัยหากไม่รองรับฉาก (และเพื่อให้จบใช่ฉันยังกังวลอยู่เล็กน้อย แต่ก็ยังเป็นเบต้า 5 ด้วย) หวังว่าคุณจะมีข้อมูลสำรองที่ดีที่สามารถจำลองสิ่งที่ฉันเห็นได้
dfd

ขอบคุณ. ฉันสงสัยว่ามีบางอย่างอยู่ในวงจรชีวิต ฉันจะใช้เวลาแก้ไขข้อบกพร่องของแอปพลิเคชัน ฉันจะอัปเดตสิ่งนี้เมื่อใดก็ตามที่ฉันคิดว่าจะช่วยใครก็ตามที่อยู่ในสถานการณ์คล้าย ๆ กัน
DavidA

8

ฉันทำให้สิ่งนี้ใช้งานได้โดยใช้คำตอบของ dfd แต่เนื่องจากแอปของฉันอยู่ใน Objective-C ฉันจึงต้องทำการเปลี่ยนแปลงอย่างใดอย่างหนึ่ง:

ใน Objective-C คุณต้องการใส่

@property (strong, nonatomic) UIWindow *window;

ใน AppDelegate.h (ไม่ใช่ใน. m)


4

โอเคฉันก็คิดออก เนื่องจากการเปลี่ยนแปลงใน iOS 13 ของรูปแบบการนำเสนอการ์ดเริ่มต้นใหม่ของ Apple ในสตอรีบอร์ดของฉันต่อจากหน้าจอเริ่มต้นไปยังตัวควบคุมการนำทางแบบกำหนดเองของฉันได้รับค่าเริ่มต้นเป็นงานนำเสนอใหม่ (ดูภาพหน้าจอด้านล่าง)

Segue

วิธีแก้ไขก็คือการกลับไปใช้รูปแบบเก่าซึ่งผิดนัดตลอดอายุการใช้งานแบบเก่า ดูภาพหน้าจอด้านล่าง

Storyboard seque ชนิด

ไม่แน่ใจว่าทำไมถึงเป็นเช่นนี้เนื่องจากที่นี่เป็นที่เดียวในแอปพลิเคชันของฉันที่ทำให้เกิดสิ่งนี้ (แอปค่อนข้างใหญ่ดังนั้นฉันต้องใช้เวลาในการอ่านสตอรีบอร์ดทั้งหมดเพื่อให้แน่ใจ)


2
คำถามของคุณถามว่าจะเลือกไม่ใช้ฉากได้อย่างไร คำตอบนี้ไม่ได้ช่วยแก้ปัญหาในการเลือกไม่ใช้ฉาก นี่ไม่ควรเป็นคำตอบที่ยอมรับได้ หากสิ่งที่คุณต้องการทำคือหลีกเลี่ยงการนำเสนอรูปแบบการ์ดใหม่คุณจะพบคำตอบนั้นในหลาย ๆ คำตอบที่ตอบคำถามนั้น
rmaddy

1

Xcode 12 - Swift 5.3 - iOS 14

ตั้งแต่ Xcode 12 ปีและด้วยความช่วยเหลือของสวิฟท์ 5.3 และ@mainคุณสามารถมี app หลากหลายที่ไม่มีหรือเหตุการณ์SceneDelegate AppDelegateจะมีเพียงไฟล์ธรรมดาเช่น:

import SwiftUI

@main
struct MyMultiPlatformApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.