ios - 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"))
}
}```
解决方案
当您使用.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))
}
}
推荐阅读
- leaflet - 在非地理地图中编辑比例尺
- python - enumerate() 不仅仅是 zip(range(len())) 吗?
- mysql - 如何选择显示数据的语句
- getuikit - 将 UIKit 集成到 Vuepress
- c# - 如何将base64字符串作为图像保存到C#中的文件夹中?
- python-3.x - 我可以禁用/删除 PyQt5 中的类(即 QEvent.KeyPress)吗?
- java - 将 java 连接到 Google Big Query 时,我在线程“main”java.lang.NoClassDefFoundError: com/google/api/client/json/JsonFactory 中出现异常
- reactjs - 反应状态行为没有产生预期的结果
- javascript - 如何按日期时间优化我的数组过滤?
- git - 如何将本地 git reset 推送到 github?