首页 > 解决方案 > Swift 中的顶栏

问题描述

我学得很快,但我有一个问题。我想制作一个覆盖整个屏幕顶部的顶部栏。现在的问题是我有一个我不明白的错误:“可选类型'CGFloat的值?' 必须解包为“CGFloat”类型的值”

我想得到帮助提前谢谢你

import Foundation

struct ContentView: View {
    var body: some View {
        VStack{
            TopBar()
            Spacer()
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}
struct TopBar : View {
    var body : some View{

        VStack(spacing: 20){
            HStack{
                Text("News").font(.system(size: 20)).fontWeight(.semibold).foregroundColor(.white)
                
                Spacer()

            }
        }.padding()
        .padding(.top, UIApplication.shared.windows.last?.safeAreaInsets.top + 10) //line with error : Value of optional type 'CGFloat?' must be unwrapped to a value of type 'CGFloat'
        .background(Color("Color"))
    }
}```

标签: iosswiftswiftuitabstabbar

解决方案


当您使用.last?该问号时,last可能不存在 - 因此,您最终会得到一个可选的 ( CGFloat?) 而不是 (non-optional) CGFloat

您可以使用 nil 合并(??运算符 - https://www.hackingwithswift.com/example-code/language/what-is-the-nil-coalescing-operator)来提供默认值,以防您的原始值为零:

.padding(.top, (UIApplication.shared.windows.last?.safeAreaInsets.top ?? 0) + 10) 

但是,您应该知道 SwiftUI 会为您提供安全区域填充——您实际上不需要自己做。如果您想要安全区域插图下方的 10 pts 顶部填充,只需使用.padding(.top, 10)

更新,基于评论

struct TopBar : View {
    var body : some View {
        VStack(spacing: 20) {
            HStack{
                Text("News").font(.system(size: 20)).fontWeight(.semibold).foregroundColor(.white)
                Spacer()
            }
        }
        .background(Color.red.edgesIgnoringSafeArea(.top))
    }
}

推荐阅读