当我尝试三元navigationBarItems以具有各种视图时出现此错误:
'? 中的结果值 :' 表达式具有不匹配的类型 'some View' 和 'ProfileImageBarButton'
@State var searchTapped: Bool = false
var body: some View {
NavigationView {
Text("lol")
--> here i get the error .navigationBarItems(leading: searchTapped ? backButton : ProfileImageBarButton(showMenu: $showMenu))
.navigationBarTitle(Text(""), displayMode: .inline)
}.overlay(searchTextField)
}
private var backButton: some View {
Image(systemName: "arrow.left")
.foregroundColor(Color.blue)
.onTapGesture {
self.searchTapped = false
}
}
Run Code Online (Sandbox Code Playgroud)
这是ProfileImageBarButton:
struct ProfileImageBarButton: View {
@Binding var showMenu: Bool
var body: some View {
Image(uiImage: UserDefaults.standard.getProfileImage()!)
.resizable()
.renderingMode(.original)
.frame(width: 30, height: 30)
.clipShape(Circle())
.onTapGesture {
self.showMenu.toggle()
}
}
}
Run Code Online (Sandbox Code Playgroud)
kon*_*iki 12
错误告诉你,在一个表达式中:
condition ? true_result : false_result
Run Code Online (Sandbox Code Playgroud)
双方true_result并false_result需要有相同的类型。
有多种方法可以克服这个问题,这里有两种:
.navigationBarItems(leading: searchTapped ? AnyView(backButton) : AnyView(ProfileImageBarButton(showMenu: $showMenu)))
Run Code Online (Sandbox Code Playgroud)
或者
.navigationBarItems(leading: barItems())
...
func barItems() -> some View {
return Group {
if searchTapped {
backButton
} else {
ProfileImageBarButton(showMenu: $showMenu)
}
}
}
Run Code Online (Sandbox Code Playgroud)
您还可以使用@ViewBuilderwhich 允许您在其主体中放置不同的视图:
.navigationBarItems(leading: barItems)
Run Code Online (Sandbox Code Playgroud)
@ViewBuilder
var barItems: some View {
if searchTapped {
backButton
} else {
ProfileImageBarButton(showMenu: $showMenu)
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2426 次 |
| 最近记录: |