หลังจากอัปเกรดเป็น Xcode 11.2 จาก Xcode 11.1 แอปขัดข้องเนื่องจาก _UITextLayoutView


351

หลังจากอัปเกรดเป็น Xcode 11.2 จาก Xcode 11.1 แอปของฉันขัดข้อง:

*** แอปสิ้นสุดเนื่องจากข้อยกเว้นที่ไม่ได้ตรวจสอบ 'NSInvalidUnarchiveOperationException' เหตุผล: 'ไม่สามารถสร้างอินสแตนซ์ของคลาสชื่อ _UITextLayoutView ได้เนื่องจากไม่พบคลาสชื่อ _UITextLayoutView จำเป็นต้องกำหนดคลาสในซอร์สโค้ดหรือลิงก์จากไลบรารี (ตรวจสอบให้แน่ใจว่าคลาสนั้นเป็นส่วนหนึ่งของเป้าหมายที่ถูกต้อง) '

ทำไมสิ่งนี้จึงเกิดขึ้น ฉันจะป้องกันความผิดพลาดนี้ได้อย่างไร


17
ดูเหมือนว่าข้อผิดพลาด Xcode 11.2 ตรวจสอบฟอรัมเธรด. developer.apple.com/thread/125287 ส่วนใหญ่มีความเกี่ยวข้องกับ TextViews ในลำดับชั้น
Pavel Stepanov

3
@DanielStorm น่าเสียดายที่ไม่ได้ช่วยอะไร ฉันเพิ่งเพิ่ม UITextView ธรรมดาให้กับหน้าจอเดียวซึ่งไม่เคยมีมาก่อน (และไม่ผิดพลาดมาก่อนเช่นกัน :)) ตอนนี้มันล้มเหลวด้วยข้อผิดพลาดเดียวกัน ปัญหายังคงมีอยู่สำหรับอุปกรณ์ / ตัวจำลองทั้งหมดยกเว้น iOS 13.2 ล่าสุด
Pavel Stepanov

3
มีใครรู้บ้างไหมว่าสิ่งนี้จะทำให้แอปที่ใช้งานจริงที่สร้างด้วย Xcode 11.2 ทำงานบนอุปกรณ์ iOS 13.1.2 หรือไม่
gfpacheco

2
นี่เป็นคำถามที่ดีอย่างสมบูรณ์ดังนั้นการลงคะแนน 198 คะแนนฉันจึงไม่แน่ใจจริงๆว่าทำไมมีคนทำเครื่องหมายว่า "ไม่ชัดเจน"
Mike Volmar

4
@MikeVolmar ฉันโหวตให้ปิดและไม่เกี่ยวข้องอีกต่อไป แก้ไขด้วย 11.2.1 คำถามนี้มีประโยชน์สั้น ๆ
rmaddy

คำตอบ:


145

การแสดงความยินดี

เวอร์ชั่นใหม่ของ Xcode (11.2.1) มีวางจำหน่ายแล้วซึ่งเป็นวิธีที่ดีที่สุดในการกำจัดปัญหานี้

วิธีการแก้ปัญหา

@ Mojtaba Hosseini วิธีแก้ปัญหาที่ฉันเสนอมาจากความช่วยเหลือและการมีส่วนร่วมจากด้านข้างของฉันไปยังนักพัฒนาเพื่อนของฉันมากกว่า StackOverflow คุณฉันและผู้พัฒนาที่เหลือทั้งหมดที่นี่รู้แล้วว่าเมื่อ Apple ประกาศเวอร์ชันใหม่ปัญหานี้จะหายไป

แต่อยู่ข้างทุกอย่าง

โซลูชันดังกล่าวได้รับการยอมรับจาก Apple Review อย่างแน่นอนเนื่องจากไม่มี API ส่วนตัวที่เกี่ยวข้องเลย วิธีนี้คล้ายกับการสร้างคุณสมบัติเช่น

@interface UITextView (เลย์เอาต์)

หรือ

UITextView + Layout.h

ดังนั้นเมื่อคุณสร้างคุณสมบัติคุณจะใช้ส่วนประกอบส่วนตัวของ APPLE โดยตรงและปรับเปลี่ยนใหม่ตามความต้องการหรือความต้องการของคุณ

ตัวอย่างง่าย ๆ คือ AMFNetworking คลาส

- (void)setImageWithURL:(NSURL *)url {
    [self setImageWithURL:url placeholderImage:nil];
}

หวังว่าฉันจะทำกับข้อกล่าวหา

คำตอบด้านล่างเป็นเพียงความช่วยเหลือจากด้านข้างของฉันเพื่อให้นักพัฒนาซอฟต์แวร์สามารถพัฒนาต่อไปได้ในขณะที่คุณเริ่มเสนอนักพัฒนาให้ย้อนกลับ Xcode นี่เป็นวิธีปฏิบัติที่ไม่ดีในการดาวน์โหลด Xcode 8 GB อีกครั้งเนื่องจากเราทุกคนรู้ว่า Xcode เวอร์ชันใหม่จะเปิดตัวเร็ว ๆ นี้

ในขณะที่มันได้รับการแก้ไขใน Xcode 11.2.1 ฉันมีวิธีแก้ไขปัญหาหนึ่งสำหรับ Xcode 11.2 ซึ่งคุณสามารถกำจัดข้อผิดพลาดนี้ได้:

*** แอปสิ้นสุดเนื่องจากข้อยกเว้นที่ไม่ได้ตรวจสอบ 'NSInvalidUnarchiveOperationException' เหตุผล: 'ไม่สามารถสร้างอินสแตนซ์ของคลาสชื่อ _UITextLayoutView ได้เนื่องจากไม่พบคลาสชื่อ _UITextLayoutView จำเป็นต้องกำหนดคลาสในซอร์สโค้ดหรือลิงก์จากไลบรารี (ตรวจสอบให้แน่ใจว่าคลาสนั้นเป็นส่วนหนึ่งของเป้าหมายที่ถูกต้อง) '

สารละลาย

ไปที่การค้นหาการตั้งค่าการสร้างสำหรับ "DEAD_CODE_STRIPPING" และตั้งเป็น NO

DEAD_CODE_STRIPPING = NO

แล้วก็

สร้างไฟล์ UITextViewWorkaround

UITextViewWorkaround.h

    #import <Foundation/Foundation.h>


    @interface UITextViewWorkaround : NSObject
    + (void)executeWorkaround; 
@end

UITextViewWorkaround.m

#import "UITextViewWorkaround.h"
#import  <objc/runtime.h>



    @implementation UITextViewWorkaround

    + (void)executeWorkaround {
        if (@available(iOS 13.2, *)) {
        }
        else {
            const char *className = "_UITextLayoutView";
            Class cls = objc_getClass(className);
            if (cls == nil) {
                cls = objc_allocateClassPair([UIView class], className, 0);
                objc_registerClassPair(cls);
    #if DEBUG
                printf("added %s dynamically\n", className);
    #endif
            }
        }
    }

    @end

ดำเนินการในแอพตัวแทน

#import "UITextViewWorkaround.h"

        - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
            // Override point for customization after application launch.

            [UITextViewWorkaround executeWorkaround];
    return yes;
    }

รวบรวมรหัสและคุณจะมีแอพที่กำลังทำงานอยู่ :)


2
หากมันทำงานให้คุณกรุณาจัดอันดับให้คนอื่นสามารถลองใช้วิธีแก้ปัญหานี้ได้เช่นกัน
aftab muhammed khan

3
@Hardy_Germany ฉันทำการทดสอบเล็กน้อยสำหรับ Swift คุณสามารถลอง: class UITextViewWorkaround: NSObject (คลาส func executeWorkaround () {ถ้า #available (iOS 13.2, *) {} อื่น {let className = "_UITextLayoutView" var cls = objc_getClass ) ถ้า cls == ไม่มี {cls = objc_allocateClassPair (UIView.self, className, 0) objc_registerClassPair (cls เป็น! AnyClass) #if DEBUG พิมพ์ ("เพิ่ม% @ แบบไดนามิก \ n", className); #endif}}}}
John Nimis

2
@DaveDude DEAD_CODE_STRIPPING = ไม่จำเป็นต้องใช้ถ้าคุณใช้สวิฟท์แพคเกจจัดการกับ Xcode 11.2
Cœur

5
@pradipsutariya ใช่แน่นอนว่าทำไมเราไม่เปลี่ยนอะไรเลยในแอปเปิ้ลคลาส
aftab muhammed khan

5
มีการเผยแพร่เมล็ดพันธุ์ Xcode 11.2.1 GM เท่านั้น (เบต้า) รุ่นที่เสถียรอาจเปิดตัวเร็ว ๆ นี้
Lal Krishna

221

อัพเดท: แก้ไข! 🎉🎊

ทางออกเดียวคือการปรับปรุง

นี้ข้อผิดพลาดจะได้รับการแก้ไขใน Xcode 11.2.1 ดังนั้นคุณสามารถดาวน์โหลดและใช้งานได้จากที่นี่

บอร์ดโครงเรื่องที่มี UITextView จะไม่ทำให้แอปพลิเคชันหยุดทำงานบนระบบปฏิบัติการเวอร์ชันก่อนหน้า iOS 13.2, tvOS 13.2 หรือ macOS 10.15.2 อีกต่อไป (56808566, 56873523)


Xcode 11.2 เลิกใช้แล้วโดย Apple ในวันที่ 5 พฤศจิกายน 2019

หากคุณพยายามส่งแอพที่สร้างด้วย Xcode 11.2 ไปยัง AppStore คุณจะถูกปฏิเสธ:

คำเตือนการดำเนินการเชื่อมต่อ App Store

คำเตือน ITMS-90703 : "Build Xcode ที่เลิกใช้แล้วเนื่องจากปัญหาที่เก็บถาวรของแอปที่ได้รับการแก้ไขเราได้เลิกใช้ Xcode 11.2 ในวันที่ 5 พฤศจิกายน 2019 ดาวน์โหลด Xcode 11.2.1 ขึ้นไปสร้างแอปของคุณใหม่และส่งใหม่"

การแก้ไขปัญหาทั้งหมดที่ทำกับ Xcode 11.2 นั้นไร้ประโยชน์


มันเป็นข้อบกพร่องสำหรับ Xcode 11.2 และได้รับการแก้ไขใน Xcode 11.2.1

วิธีการแก้ปัญหา (s)

ย้อนกลับไปสู่รุ่นที่วางจำหน่าย Xcode ก่อนหน้าจาก: Rollback ไม่ใช่ตัวเลือกอีกต่อไปและ AppStore จะปฏิเสธงานสร้างใด ๆ ที่มี Xcode ด้านล่าง 11.2.1 ดูที่นี่

https://developer.apple.com/services-account/download?path=/Developer_Tools/Xcode_11.1/Xcode_11.1.xip

โปรดทราบว่าคุณควรใช้ Safari เพื่อดาวน์โหลดและคุณต้องลงชื่อเข้าใช้พอร์ทัลผู้พัฒนาของ Appleก่อน

คุณสามารถค้นหาลิงค์ Xcode และแหล่งข้อมูลอื่น ๆ ทั้งหมด (รวมถึงรุ่นที่วางจำหน่ายและรุ่นเบต้า) ที่นี่ที่https://developer.apple.com/download/more

วิธีแก้ปัญหา

มันยากมาก แต่วิธีแก้ปัญหาการทำงาน แทนที่UITextViews ทั้งหมดในสตอรี่บอร์ดและXib s ด้วยเวอร์ชันรหัสเพียว


โปรดทราบว่านี้ข้อผิดพลาดที่พบและแก้ไขโดยแอปเปิ้ล

แก้ไขแล้ว

ก่อนหน้านี้ข้อผิดพลาดได้รับการยืนยันโดยApple Staff edford

การยืนยัน


สำหรับผู้ที่ใช้ iOS 13.2 และไม่สามารถใช้ Xcode 11.1 ได้อีกต่อไป:

  1. อัปเดต macOS เป็น 10.15.1 หรือใหม่กว่า
  2. ติดตั้ง Xcode 11.2.1 หรือใหม่กว่า
  3. มันควรจะใช้งานได้ในอุปกรณ์ที่อัพเดตแล้ว

สำหรับผู้ที่มีสตอรีบอร์ด:

  1. ประเภทรอง UITextView
  2. กำหนดให้กับทุกคน UITextViewวัตถุ
  3. อย่าลืมอัปเดตการเปลี่ยนแปลงคุณสมบัติที่อาจทำให้สูญเสียในคลาสย่อย

สำหรับผู้ที่สะดวกสบายด้วยเมธอด swizzling (Objc และพฤติกรรมแบบไดนามิก)

ตรงไปที่คำตอบ@aftab muhammed khan สำหรับ Objective-Cและคำตอบ@MikRo สำหรับ Swift ดัดแปลงเวอร์ชัน

อย่าทำอีกต่อไป:

แม้ว่าการแก้ไขปัญหาสองครั้งสุดท้ายของ Swizzling เหล่านี้ไม่ได้ใช้API ส่วนตัวของ Appleพวกเขาจะถูกปฏิเสธใน AppStore เพราะApple จะไม่ยอมรับการสร้างด้วย Xcode เวอร์ชันต่ำกว่า 11.2.1 !

และอีกครั้ง:

Xcode 11.2 เลิกใช้แล้วโดย Apple ในวันที่ 5 พฤศจิกายน 2019


3
เศร้า แต่วิธีแก้ปัญหานี้ใช้ได้สำหรับฉัน ขอบคุณ! 11.1 ผลงาน ฉันจะไม่แนะนำให้แปลงเป็นรหัสบริสุทธิ์เพราะฉันพนันว่ามีการแก้ไขออกมาในไม่ช้า หากคุณไม่รังเกียจ: อัปเดตคำตอบนี้เมื่อมีเวอร์ชันใหม่ที่ใช้งานได้ จะไม่ดีถ้าผู้คนเริ่มดาวน์โหลดเหตุการณ์ 11.1 ถึงแม้ว่าจะมีรุ่นที่แก้ไขแล้ว :)
Sebastian Weiß

2
ฉันมี 11.1 แล้วแต่ใช้งานไม่ได้ฉันไม่ได้อัปเกรดเป็น 11.2
JAHelia

6
โปรดทราบว่าคุณควรลบแอพออกจากอุปกรณ์สำหรับการพัฒนาและ / หรือล้างโฟลเดอร์การสร้างของ Xcode ( CMD + Shift + K)
JeroenJK

3
ฉันจะอัพเกรดเป็น v11.2.1 ได้อย่างไร? มันไม่ปรากฏขึ้นในแอปสโตร์ และการดาวน์โหลดเมล็ดพันธุ์จีเอ็มจากพอร์ทัลนักพัฒนาพยายามที่จะดาวน์โหลดแอปทั้งหมดประมาณ 8gb!
mesqueeb

3
และถ้ามันเลิกใช้แล้วทำไม Apple ไม่ลบ 11.2 ใน app store ทันที
มิลล์ส์ซัลวาดอร์

40

ปัญหาได้รับการแก้ไขใน Xcode 11.2.1

แก้ไข:เนื่องจากการแก้ไขได้ออกมาแล้วในตอนนี้คุณควรเปลี่ยนไปใช้เวอร์ชัน Xcode นั้นและแสดงความคิดเห็นวิธีแก้ปัญหานี้ ดัง Mojtaba Hosseini ในคำตอบของเขากล่าวถึง:

... วิธีแก้ไขปัญหาสองข้อสุดท้ายเหล่านี้กำลังใช้ API ส่วนตัวของ Apple และจะถูกปฏิเสธจากการตรวจสอบของ Apple!

สำหรับช่วงเวลาก่อนที่การแก้ไขจะออกโดย Apple นี่เป็นวิธีแก้ปัญหาที่ดีในการพัฒนาและทดสอบต่อไป


สำหรับ Xcode 11.2 ตามแนวคิดของ Aftab Muhammed Khan และด้วยความช่วยเหลือของ John Nimis ฉันเพิ่งทดสอบรหัสต่อไปนี้

ไม่มีการเปลี่ยนแปลงในไฟล์เรื่องราวที่จำเป็น!

แก้ไขไฟล์ AppDelegate.swift แล้วเพิ่มคลาสนี้

//******************************************************************
// MARK: - Workaround for the Xcode 11.2 bug
//******************************************************************
class UITextViewWorkaround: NSObject {

    // --------------------------------------------------------------------
    // MARK: Singleton
    // --------------------------------------------------------------------
    // make it a singleton
    static let unique = UITextViewWorkaround()

    // --------------------------------------------------------------------
    // MARK: executeWorkaround()
    // --------------------------------------------------------------------
    func executeWorkaround() {

        if #available(iOS 13.2, *) {

            NSLog("UITextViewWorkaround.unique.executeWorkaround(): we are on iOS 13.2+ no need for a workaround")

        } else {

            // name of the missing class stub
            let className = "_UITextLayoutView"

            // try to get the class
            var cls = objc_getClass(className)

            // check if class is available
            if cls == nil {

                // it's not available, so create a replacement and register it
                cls = objc_allocateClassPair(UIView.self, className, 0)
                objc_registerClassPair(cls as! AnyClass)

                #if DEBUG
                NSLog("UITextViewWorkaround.unique.executeWorkaround(): added \(className) dynamically")
               #endif
           }
        }
    }
}

และภายในการมอบหมายของตัวแทนสำหรับ "didFinishLaunchingWithOptions" ให้เรียกวิธีแก้ปัญหา

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

    // Override point for customization after application launch.

    // This is the workaround for Xcode 11.2
    UITextViewWorkaround.unique.executeWorkaround()
}

34

ฉันได้ดัดแปลงโซลูชัน Obj-C ของ khan เป็นSwift :

import UIKit

@objc
class UITextViewWorkaround : NSObject {

    static func executeWorkaround() {
        if #available(iOS 13.2, *) {
        } else {
            let className = "_UITextLayoutView"
            let theClass = objc_getClass(className)
            if theClass == nil {
                let classPair: AnyClass? = objc_allocateClassPair(UIView.self, className, 0)
                objc_registerClassPair(classPair!)
            }
        }
    }

}

เรียกว่าในตอนท้ายของในdidFinishLaunchingWithOptionsAppDelegate

ขอบคุณ @Artab!


เราจำเป็นต้องเพิ่มรหัสนี้ที่ไหน ในไฟล์ตัวแทน?
SIDHARTH PU

@SIDHARTHPU คุณสามารถโทรหาได้ที่didFinishLaunchingWithOptions
Lal Krishna

ลองใช้การแก้ไขที่หลากหลายเกี่ยวกับปัญหานี้และอันนี้ทำเคล็ดลับจนถึง Xcode 11.3! ขอบคุณ!
FlimFlam Vir

1
นี่เป็นวิธีแก้ปัญหาที่สั้นและยอดเยี่ยมที่สุด!
sVd

1
@LalKrishna สร้างไฟล์ใหม่ชื่อ UITextViewWorkaround.swift และเพิ่มโค้ดด้านบนลงไป จากนั้นเพิ่ม UITextViewWorkaround.executeWorkaround () สิ่งนี้เพื่อ didFinishLaunchingWithOptions ก่อนที่จะส่งคืน statement
Ashishn

22

การแก้ไขที่รวดเร็วกว่า:

///Substitute class for _UITextLayoutView bug
class FixedTextView: UITextView {
    required init?(coder: NSCoder) {
        if #available(iOS 13.2, *) {
            super.init(coder: coder)
        }
        else {
            let rect = CGRect(origin: .zero, size: CGSize(width: 100, height: 44*3))
            super.init(frame: rect, textContainer: nil)
        }
    }
}

เพิ่มรหัสนี้ที่ใดที่หนึ่งแล้วแทนที่อินสแตนซ์กระดานเรื่องราวทั้งหมดเป็น FixedTextViewเพิ่มรหัสนี้อยู่ที่ไหนสักแห่งแล้วแทนที่อินสแตนซ์สตอรี่บอร์ดทั้งหมดเพื่อ

หมายเหตุ: คุณจะสูญเสียคุณลักษณะใด ๆ ที่สร้างขึ้นในกระดานเรื่องราว สิ่งนี้อาจมีผลกระทบร้ายแรง (เช่นการตั้งค่าผู้ร่วมประชุมขนาด ฯลฯ )


ดูเหมือนว่าจะเป็นขั้นตอนที่ดีต่อการแก้ปัญหา แต่ยังไม่ได้แก้ปัญหาเลย ...
464

18

โซลูชันที่ อัปเดต:อัปเดตเป็นXcode 11.2.111.2.1 มันทำงานบนอุปกรณ์ iOS 11, 12 หรือ 13 สำหรับฉัน

อ้างถึงเอกสารของ Apple อัปเดตนี้แก้ไขปัญหาร้ายแรงที่อาจทำให้แอปที่ใช้ UITextView ขัดข้อง

โซลูชันเก่า: ดาวน์โหลด Xcode 11.1 จากhttps://developer.apple.com/download/more/ การสลับกลับจาก 11.2 เป็น 11.1 แก้ไขข้อผิดพลาด

นอกจากนี้สำหรับฉันแม้แต่กับ Xcode 11.2 เมื่อฉันอัพเกรด iPhone เป็น 13.2 นั่นก็คือการแก้ไขข้อขัดข้อง


2
นี่คือการแก้ไขที่ง่ายที่สุด - อัปเกรด iPhone iOS เป็น 13.2
Reefwing

6
การอัพเกรด iOS ไม่ชัดเจนว่าจะมีการแก้ไขเนื่องจาก OP กำลังพูดถึงในมุมมองของนักพัฒนา
keeshux

2
Apple ยืนยันว่าข้อผิดพลาดเกิดขึ้นกับ iOS เวอร์ชันก่อนหน้า 13.2 และ Xcode 11.2
Chuck Krutsinger

ลดระดับ XCode เป็นเวอร์ชัน 11.1 (11A1027) - ยังมีข้อผิดพลาดเดียวกัน (
rommex

หากคุณอัปเกรดหรือดาวน์เกรดและยังคงขัดข้องโฟลเดอร์ build ของ Xcode (CMD + Shift + K) ที่สะอาดต่อความคิดเห็นของ Wojteck ด้านล่างซึ่งแก้ไขสิ่งนี้ให้ฉันเมื่ออัปเกรด
Mike Volmar

17

11.2.1 เมล็ดพันธุ์ GM แก้ไขปัญหานี้ได้

(และสามารถใช้เพื่อเผยแพร่ไปยัง App Store)

ไปที่https://developer.apple.com/download/ ดาวน์โหลด Xcode 11.2.1 GM seed

บันทึกประจำรุ่นยืนยันว่าแก้ไขข้อผิดพลาดนี้:

ป้อนคำอธิบายรูปภาพที่นี่


5
โปรดทราบว่าหลังจากติดตั้ง Xcode 11.2.1 seed GM แล้วคุณควรลบแอพออกจากอุปกรณ์ในการพัฒนาและ / หรือล้างโฟลเดอร์ build ของ Xcode (CMD + Shift + K)
Wojtek Dmyszewicz

13

คุณสามารถไปดาวน์โหลด Xcode เบต้าล่าสุด (11.2.1 GM) จากเว็บไซต์นักพัฒนา Apple

ที่นี่ลิงค์โดยตรง

เมล็ด Xcode 11.2.1 GM


โปรดทราบว่าหลังจากติดตั้ง Xcode 11.2.1 seed GM แล้วคุณควรลบแอพออกจากอุปกรณ์ในการพัฒนาและ / หรือล้างโฟลเดอร์ build ของ Xcode (CMD + Shift + K)
Wojtek Dmyszewicz

ติดตั้งและรันโดยไม่มีโพรซีเดอร์อื่น แก้ไขปัญหาแล้ว✌️
BossOz

ฉันจะติดตั้งสิ่งนี้ได้อย่างไร มันให้โฟลเดอร์ฉัน แต่ไม่มีการปฏิบัติการ
Scobee

1
เพียงดาวน์โหลด zip จากลิงค์ที่มีให้และแตกไฟล์ จากนั้นคัดลอกแอปในโฟลเดอร์แอปพลิเคชัน
BossOz

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

12

การปรับปรุงคำตอบ @garafajon สำหรับฉันมันใช้งานได้ในกรณีส่วนใหญ่

///Substitute class for _UITextLayoutView bug
class FixedTextView: UITextView {
    required init?(coder: NSCoder) {
        if #available(iOS 13.2, *) {
            super.init(coder: coder)
        }
        else {
            super.init(frame: .zero, textContainer: nil)
            self.autoresizingMask = [.flexibleWidth, .flexibleHeight]
            self.contentMode = .scaleToFill

            self.isScrollEnabled = false   // causes expanding height

            // Auto Layout
            self.translatesAutoresizingMaskIntoConstraints = false
            self.font = UIFont(name: "HelveticaNeue", size: 18)
        }
    }
}

1
ทำงานได้อย่างสมบูรณ์แบบ รหัส @ garafajon ทำให้เกิดปัญหากับกล่องในสถานที่ที่ไม่คาดคิด วิธีนี้ช่วยแก้ไขปัญหาเหล่านั้นได้ดีมาก!
ekrenzin

8

ในฐานะที่เป็น "แก้ไขด่วน" คุณสามารถเพิ่มUITextViewรหัสโดยตรงจากโค้ดไม่ใช่ผ่าน IB อย่างน้อยมันก็ใช้งานได้สำหรับฉัน แม้ว่าจากมุมมองของฉันมันเป็นการดีกว่าที่จะย้อนกลับไปยัง Xcode ก่อนหน้า / รอใหม่


6

มันเป็นข้อผิดพลาดกับ Xcode 11.2 Textviews แบบคลาสสิกจะหยุดทำงานบนอุปกรณ์ทั้งหมดที่ไม่ได้ติดตั้ง iOS build (13.2) ชุดใหม่ คุณน่าจะดีกว่าถ้าไม่สร้างรุ่นที่มีโครงสร้างนั้น

ตอนนี้คุณสามารถ:

  • ปรับลด Xcode เป็น 11.1 หรือ
  • อัปเกรดอุปกรณ์ของคุณเป็น iOS 13.2

1
ดังนั้นข้อผิดพลาดนี้ส่งผลกระทบต่อมุมมองข้อความที่ซับคลาสเท่านั้น
Darren

1
การอัปเดต iOS เมื่ออัปเดต Xcode แก้ไขปัญหา
Brian

2
คำถามคือถ้าความผิดพลาดจะเกิดขึ้นในแอพที่วางจำหน่ายกับ iOS ทุกตัวที่เล็กกว่า 13.2 ... ฉันกลัวที่จะลอง ...
mark.so.cgn

6

ฉันใช้วิธีแก้ปัญหาที่ประสบความสำเร็จ แต่มันเจ็บปวด นี่เป็นกระบวนการที่ฉันทำตาม:

  1. เปิด XIB ในเท็กซ์เอดิเตอร์
  2. TextViewค้นหาที่กระทำผิด ในกรณีของฉัน:
<textView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" textAlignment="natural" translatesAutoresizingMaskIntoConstraints="NO" id="782-j1-88c" customClass="LCAnsiConsoleTextView">
  <rect key="frame" x="16" y="20" width="343" height="589"/>
  <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
  <fontDescription key="fontDescription" name="Menlo-Regular" family="Menlo" pointSize="12"/>
  <textInputTraits key="textInputTraits" autocapitalizationType="sentences"/>
</textView>
  1. หมายเหตุของมันid(ในกรณีของฉัน: id="782-j1-88c")
  2. แทนที่ชั้นเรียนตามที่ระบุไว้ในคำตอบข้างต้นและสร้างตัวเลือกใหม่ (ของฉันคือ Objective-C, ขออภัย):
@implementation FixedTextView

- (id) initWithCoder:(NSCoder*)coder
{
    if ([[NSProcessInfo processInfo] isOperatingSystemAtLeastVersion:(NSOperatingSystemVersion){13,2,0}])
        self = [super initWithCoder:coder];
    else {
        self = [super initWithFrame:CGRectMake(16, 3, 343, 605)];
        self.editable = YES;
        self.selectable = YES;
        self.insetsLayoutMarginsFromSafeArea = YES;
        self.clipsToBounds = YES;
        self.clearsContextBeforeDrawing = YES;
        self.autoresizesSubviews = YES;
        self.contentMode = UIViewContentModeScaleToFill;
        self.scrollEnabled = YES;
        self.userInteractionEnabled = YES;
        self.multipleTouchEnabled = YES;
        self.translatesAutoresizingMaskIntoConstraints = NO;
        self.font = [UIFont fontWithName:@"Menlo-Regular" size:12.0];
    }
    return self;
}
  1. บันทึกข้อ จำกัด ที่มี id มุมมองข้อความของคุณและสร้างข้อ จำกัด เหล่านั้นกับรหัสองค์ประกอบอื่น ๆ ในมุมมองหรือตัวควบคุมมุมมองของคุณ ในกรณีของฉัน:
- (id) initWithCoder:(NSCoder *)aDecoder
{
    self = [super initWithCoder:aDecoder];
    if (self) {
        [self xibSetup];
        [self initView];
/*
        <constraint firstItem="75C-lt-YtE" firstAttribute="top" secondItem="782-j1-88c" secondAttribute="bottom" constant="8" symbolic="YES" id="8SH-5l-FAs"/>
        <constraint firstItem="782-j1-88c" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leadingMargin" id="Mve-aZ-HCe"/>
        <constraint firstItem="782-j1-88c" firstAttribute="leading" secondItem="75C-lt-YtE" secondAttribute="leading" id="dPG-u3-cCi"/>
        <constraint firstItem="782-j1-88c" firstAttribute="trailing" secondItem="iN0-l3-epB" secondAttribute="trailingMargin" id="sjT-0Q-hNj"/>
        <constraint firstItem="782-j1-88c" firstAttribute="top" secondItem="vUN-kp-3ea" secondAttribute="top" id="vic-vZ-osR"/>
*/
        [self.command.topAnchor constraintEqualToAnchor:self.console.bottomAnchor constant:8].active = YES;
        [self.console.leadingAnchor constraintEqualToAnchor:self.layoutMarginsGuide.leadingAnchor].active = YES;
        [self.console.leadingAnchor constraintEqualToAnchor:self.command.leadingAnchor].active = YES;
        [self.console.trailingAnchor constraintEqualToAnchor:self.trailingAnchor].active = YES;
        [self.console.topAnchor constraintEqualToAnchor:self.safeAreaLayoutGuide.topAnchor].active = YES;

    }
    return self;
}

การทำเช่นนี้แก้ไขปัญหาให้ฉันโดยไม่สูญเสียฟังก์ชันการทำงานที่ต้องการ โชคดีที่ฉันมีเพียงหนึ่งที่UITextViewจะเปลี่ยน มิฉะนั้นสิ่งนี้จะไม่สามารถป้องกันได้


2

ฉันมีปัญหาเดียวกันฉันเพิ่งอัพเกรด Xcode 11.2 เป็น 11.2.1 มันใช้งานได้ดี

หลังจากอัปเกรดฉันได้ทดสอบเหมือนกันใน iOs 13 และ iOS 12 และทำงานได้ดี


ทำซ้ำคำตอบของ BossOz
Cœur

0

1. ปัญหา:

มีปัญหากับ Xcode 11.2 นั้นสตอรี่บอร์ดที่มี UITextView จะทำให้แอปขัดข้องในระบบปฏิบัติการเวอร์ชันก่อนหน้า iOS 13.2 หากคอมไพล์ด้วย Xcode 11.2

Xcode 11.2

ตรวจสอบเอกสารประกอบของ Appleนี้

2. โซลูชั่น:

ทางออกเดียวคืออัปเดต Xcode ของคุณเป็น11.2.1หรือ11.3

Xcode 11.2.1 เปิดตัวเป็นพิเศษเพื่อแก้ไขปัญหาความผิดพลาดนี้

ป้อนคำอธิบายรูปภาพที่นี่ ตรวจสอบเอกสารประกอบของ Apple นี้

3. ข้อเสนอแนะ:

ฉันขอแนะนำให้คุณไปกับ Xcode 11.3 เวอร์ชันล่าสุดเนื่องจากรองรับการพัฒนาแอพสำหรับ iOS 13.3 และยังมีคุณสมบัติใหม่มากมาย ตรวจสอบเอกสารประกอบของ Appleนี้


-1

ปัญหานี้ได้รับการแก้ไขใน Xcode เวอร์ชัน 11.2.1 และเรียกใช้ในบันทึกย่อประจำรุ่น:

โปรแกรมปรับปรุงนี้แก้ไขปัญหาร้ายแรงที่อาจทำให้แอปที่ใช้ UITextView ขัดข้อง

สกรีนช็อตบันทึกย่อของ Xcode

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.