'? 中的结果值 :' 表达式的类型不匹配 'some View' 和 '...'

jsb*_*eJS 8 swift swiftui

当我尝试三元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_resultfalse_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)


paw*_*222 7

您还可以使用@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)