Xcode 11.4 สีหัวเรื่องของการนำทางหายไปจากกระดานเรื่องราว


55

ฉันเพิ่งอัปเดต Xcode เป็น 11.4 เมื่อฉันเรียกใช้แอปบนอุปกรณ์ฉันสังเกตเห็นว่าชื่อของรายการการนำทางทั้งหมดของฉันเป็นสีดำสนิทเมื่อถูกตั้งค่าจากกระดานเรื่องราว ป้อนคำอธิบายรูปภาพที่นี่

คุณไม่สามารถเปลี่ยนจากรหัสได้รหัสต่อไปนี้ใช้ไม่ได้อีกต่อไป

self.navigationController?.navigationBar.titleTextAttributes = [.foregroundColor: UIColor.white]

ฉันทำให้มันใช้งานได้กับอุปกรณ์ iOS 13 เท่านั้น UINavigationBarAppearance

@available(iOS 13.0, *)
    private func setupNavigationBar() {
        let app = UINavigationBarAppearance()
        app.titleTextAttributes = [.foregroundColor: UIColor.white]
        app.backgroundColor = Constants.Color.barColor
        self.navigationController?.navigationBar.compactAppearance = app
        self.navigationController?.navigationBar.standardAppearance = app
        self.navigationController?.navigationBar.scrollEdgeAppearance = app

        self.navigationController?.navigationBar.titleTextAttributes = [.foregroundColor: UIColor.white]
    }

ใครสามารถอธิบายได้ว่าทำไม นี่เป็นข้อบกพร่องที่สำคัญหรือมีคุณลักษณะใหม่ที่ซ่อนอยู่หรือไม่


3
ปัญหาเดียวกันที่นี่และฉันหาอะไรทำเพื่อแก้ไขนี้ ฉันคิดว่ามันเป็นข้อผิดพลาด: /
Jordan Favray

แอปเปิ้ล. Uggh จริงๆ?
แดเนียล


มันเป็นตัวสร้างส่วนต่อ
ประสาน

คำตอบ:



36

วิธีนี้แก้ไขได้สำหรับฉันโดยใช้ UINavigationBarAppearance แทนจาก: การกำหนดค่าแถบนำทางของแอปของคุณเอง

if #available(iOS 13.0, *) {
    let appearance = UINavigationBarAppearance()
    appearance.configureWithOpaqueBackground()
    appearance.backgroundColor = UIColor.black
    appearance.titleTextAttributes = [.foregroundColor: UIColor.white] // With a red background, make the title more readable.
    self.navigationBar.standardAppearance = appearance
    self.navigationBar.scrollEdgeAppearance = appearance
    self.navigationBar.compactAppearance = appearance // For iPhone small navigation bar in landscape.
} else {
    self.navigationBar.barTintColor = UIColor.black
    self.navigationBar.tintColor = UIColor.white
    self.navigationBar.titleTextAttributes = [.foregroundColor: UIColor.white]
}

หมายเหตุ: ผม subclassed UINavigationControllerและนี้ถูกเรียกว่าจากการแทนที่ของviewWillAppear

... หรือสำหรับAppDelegateทั้งแอป:

if #available(iOS 13.0, *) {
    let appearance = UINavigationBarAppearance()
    appearance.configureWithOpaqueBackground()
    appearance.backgroundColor = UIColor.black
    appearance.titleTextAttributes = [
        NSAttributedStringKey.foregroundColor: UIColor.white
    ]

    let buttonAppearance = UIBarButtonItemAppearance()
    buttonAppearance.normal.titleTextAttributes = [.foregroundColor: UIColor.white]
    appearance.buttonAppearance = buttonAppearance

    UINavigationBar.appearance().standardAppearance = appearance
    UINavigationBar.appearance().scrollEdgeAppearance = appearance
    UINavigationBar.appearance().compactAppearance = appearance

    UIBarButtonItem.appearance().tintColor = UIColor.white
} else {
    UINavigationBar.appearance().barTintColor = UIColor.black
    UINavigationBar.appearance().titleTextAttributes = [
        NSAttributedStringKey.foregroundColor: UIColor.white
    ]
    UINavigationBar.appearance().tintColor = UIColor.white

    UIBarButtonItem.appearance().tintColor = UIColor.white
}

... สำหรับ AppDelegate ทั้งแอปใน Objective-C:

if (@available(iOS 13, *)) {
    UINavigationBarAppearance *appearance = [[UINavigationBarAppearance alloc] init];
    [appearance configureWithOpaqueBackground];
    appearance.backgroundColor = UIColor.whiteColor;
    appearance.titleTextAttributes = titleAttributes;

    UIBarButtonItemAppearance *buttonAppearance = [[UIBarButtonItemAppearance alloc] init];
    buttonAppearance.normal.titleTextAttributes = barButtonItemAttributes;
    appearance.buttonAppearance = buttonAppearance;

    UINavigationBar.appearance.standardAppearance = appearance;
    UINavigationBar.appearance.scrollEdgeAppearance = appearance;
    UINavigationBar.appearance.compactAppearance = appearance;

    [[UINavigationBar appearance] setTintColor:UIColor.blackColor];
} else {
    [[UINavigationBar appearance] setBarTintColor:UIColor.whiteColor];
    [[UINavigationBar appearance] setTintColor:UIColor.blackColor];
    [[UINavigationBar appearance] setTranslucent:false];
    [[UINavigationBar appearance] setTitleTextAttributes: titleAttributes];
    [[UIBarButtonItem appearance] setTitleTextAttributes:barButtonItemAttributes forState:UIControlStateNormal];
}

ขอบคุณนี่เป็นคำตอบที่ถูกต้อง! , ใน iOS 13 Apple เพิ่มUINavigationBarAppearance()และไม่มีเหตุผลใน Xcode เก่าเราไม่ต้องพึ่งมัน แต่เนื่องจาก Xcode 11.4 มันต้องใช้UINavigationBarAppearance()หรือชื่อสีจะเป็นสีดำเสมอ
Basil

appearance.largeTitleTextAttributesสำหรับชื่อเรื่องที่มีขนาดใหญ่
Skoua

มันใช้งานได้ดีมากและขอขอบคุณ!
แบ่งส่วนข้อมูล

@slicerdicer - อ๋อ! ดูคำตอบที่อัปเดตของฉันสำหรับตัวอย่าง ไชโย
Stu Carney

1
@Richard - ฉันเพิ่งเพิ่มคำตอบสำหรับ Objective-C ขออภัยฉันไม่เห็นความคิดเห็นของคุณจนกระทั่งวันนี้
Stu Carney

14

บนกระดานเรื่องราวสำหรับตัวควบคุมทิศทางของคุณให้เปลี่ยน "Bar Tint" เป็นค่า "เริ่มต้น" จากนั้นคุณสามารถเปลี่ยนมันได้ตามปกติ


3
คำตอบที่ดีที่สุด จริงๆ.
Vladimir Prigarin

2
นี่เป็นวิธีที่เหมาะสม
ฮูโก้

1
ช่วงเวลาที่ดีที่สุด
shadowsheep

2
@ JCutting8 yup ใช่แล้ว แต่ด้วย Xcode 11.4 หากคุณไม่ได้ตั้งค่าสีเริ่มต้นในกระดานเรื่องราวให้เปลี่ยนเป็นสีโดยทางโปรแกรมไม่ทำงาน ฉันไม่รู้ว่านี่เป็นปัญหาหรือไม่
shadowsheep

1
นี่คือเวทมนตร์!
ekashking

6

ไม่แน่ใจว่ามันเป็นบั๊กหรือเปล่า

วิธีที่เราแก้ไขคือการตั้งค่า "ลักษณะแถบสถานะ" เป็นเนื้อหามืดหรือสว่างในการตั้งค่าโครงการ วิธีนี้จะบังคับให้สีข้อความของแถบสถานะเป็นวิธีที่แน่นอนแทนที่จะถูกกำหนดตามอุปกรณ์ที่อยู่ในโหมดแสงหรือมืด

นอกจากนี้คุณต้องตั้งค่า "ดูแถบสถานะตามตัวควบคุม" เป็น "ไม่" ใน Info.plist ของคุณ หากไม่มีค่าดังกล่าว "สไตล์แถบสถานะ" จะถูกเขียนทับ

จากนั้นสร้างตัวควบคุมการนำทางแบบกำหนดเองและนำไปใช้ในกระดานเรื่องราวของคุณ

class CustomNavigationController: UINavigationController {

 override func viewDidLoad() {
    super.viewDidLoad()
    setNavBar()
 }

 func setNavBar() {
    if #available(iOS 13.0, *) {
        let appearance = UINavigationBarAppearance()
        appearance.configureWithOpaqueBackground()
        appearance.backgroundColor = UIColor.blue
        appearance.titleTextAttributes = [.foregroundColor: UIColor.yellow]
        self.navigationBar.standardAppearance = appearance
        self.navigationBar.scrollEdgeAppearance = appearance
        self.navigationBar.compactAppearance = appearance
    } else {
        self.navigationBar.barTintColor = UIColor.blue
        self.navigationBar.titleTextAttributes = [.foregroundColor: UIColor.yellow]
    }
  }
}

* มีการตั้งค่าสีเพื่อให้คุณเห็นการทำงานอย่างชัดเจน

ฉันพบว่าเป็นการดีกว่าที่จะตั้งรหัสใน ViewDidLoad มากกว่า ViewDidAppear เพราะสีของฉันไม่ได้ถูกตั้งค่าไว้ในการโหลดครั้งแรกหลังจากนำทางกลับและโหลดซ้ำเท่านั้น

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

หวังว่ามันจะช่วย


มันใช้งานได้ ดูเหมือนว่ามันเป็นเพียงการตั้งค่าสไตล์โลกที่ไม่ทำงาน
Mongo

def ข้อผิดพลาดในตอนท้ายของแอปเปิ้ล อดไม่ได้ที่จะแตกหัก>> <
Michael McKenna

2

ไม่ต้องการ workaround.it เป็นข้อผิดพลาดใน Xcode Interface Builder Apple อัพเดทสำหรับ Xcode 11.4.1

จากบันทึกย่อประจำรุ่นของนักพัฒนา Apple

เครื่องมือสร้างส่วนต่อประสาน

แก้ไขปัญหาที่ทำให้คุณสมบัติลักษณะที่ปรากฏของ UINavigationBar บางอย่างถูกตั้งค่าในสตอรีบอร์ดและเอกสาร XIB ที่จะถูกละเว้นเมื่อสร้างด้วย Xcode 11.4 (60883063) (FB7639654)

https://developer.apple.com/documentation/xcode_release_notes/xcode_11_4_1_release_notes


0

คล้ายกับการตอบสนองของ Stu Carney เมื่อ 3/25 ฉันเพิ่มรายละเอียดการใช้งานอีกสองสามรายการ

สร้าง subclass ของUINavigationController เพิ่มรายการต่อไปนี้เพื่อดู WillAppear:

let isDarkMode = UserDefaults.standard.bool(forKey: "DarkMode")
let titleColor: UIColor = isDarkMode ? .white : .black
let navBarColor: UIColor = isDarkMode ? .black : .white
let tintColor: UIColor = isDarkMode ? .yellow : .red  //back button text and arrow color, as well as right bar button item

if #available(iOS 13.0, *) {
    let appearance = UINavigationBarAppearance()
    appearance.configureWithOpaqueBackground()
    appearance.backgroundColor = navBarColor
    appearance.titleTextAttributes = [.foregroundColor: titleColor]
    appearance.largeTitleTextAttributes = [.foregroundColor: titleColor]

    self.navigationBar.standardAppearance = appearance
    self.navigationBar.scrollEdgeAppearance = appearance
    self.navigationBar.compactAppearance = appearance // For iPhone small navigation bar in landscape.

    self.navigationBar.tintColor = tintColor //changes back button text and arrow color, as well as right bar button item
} else {
    self.navigationBar.barTintColor = navBarColor
    self.navigationBar.tintColor = tintColor
    self.navigationBar.titleTextAttributes = [.foregroundColor: titleColor]
    self.navigationBar.largeTitleTextAttributes = [.foregroundColor: titleColor]
}

จากนั้นแทนที่ที่ต้องการ StatusBarStyle :

override var preferredStatusBarStyle: UIStatusBarStyle {
    let isDarkMode = UserDefaults.standard.bool(forKey: "DarkMode")
    return isDarkMode ? .lightContent : .default
}

หากคุณต้องการอัปเดตแถบนำทางและแถบสถานะแบบไดนามิกเช่นจาก UISwitch IBAction หรือวิธีการเลือกให้เพิ่มรายการต่อไปนี้:

navigationController?.loadView()
navigationController?.topViewController?.setNeedsStatusBarAppearanceUpdate()

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


0

ในกรณีของฉันหลังจากฉันอัพเกรด Xcode จาก 11.3 เป็น 11.4 ข้อผิดพลาดนี้เกิดขึ้น ดังนั้นฉันต้องเปลี่ยนรหัสของฉันให้เป็นระเบิดเพื่อตั้งค่ารูปภาพเป็นพื้นหลังในแถบนำทาง

if #available(iOS 13.0, *) {
    let appearance = UINavigationBarAppearance()
    appearance.configureWithOpaqueBackground()
    let backgroundImage = UIImage(named: "{NAVBAR_IMAGE_NAME}")?.resizableImage(withCapInsets: UIEdgeInsets.zero, resizingMode: .stretch)
    appearance.backgroundImage = backgroundImage
    self.navigationController?.navigationBar.compactAppearance = appearance
    self.navigationController?.navigationBar.standardAppearance = appearance
    self.navigationController?.navigationBar.scrollEdgeAppearance = appearance        
} else {
    self.navigationController?.navigationBar.barTintColor = Utils.themeColor
    let backgroundImage = UIImage(named: "{NAVBAR_IMAGE_NAME}")?.resizableImage(withCapInsets: UIEdgeInsets.zero, resizingMode: .stretch)
    self.navigationController?.navigationBar.setBackgroundImage(backgroundImage, for: .default)
    self.navigationController?.navigationBar.shadowImage = UIImage()
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.