Swiftui 具有#可用的条件修饰符未正确执行

Swiftui 具有#可用的条件修饰符未正确执行,swiftui,Swiftui,我有一个自定义修改器,可以用图像视图替换导航栏标题,在iOS 14中,使用.toolbar修改器非常简单,但是在iOS 13中,它需要更多的工作,但这是可能的 当我想在条件修饰符中同时使用这两种解决方案时,问题就出现了,下面的代码再现了这个问题,它在iOS 14上运行时可以工作,但在iOS 13上不会产生结果,但是如果从修饰符中删除“#available”(可用)条件,只留下iOS 13代码,它就会按预期工作。在AnyView中包装iOS 14也无济于事: extension View

我有一个自定义修改器,可以用图像视图替换导航栏标题,在iOS 14中,使用.toolbar修改器非常简单,但是在iOS 13中,它需要更多的工作,但这是可能的

当我想在条件修饰符中同时使用这两种解决方案时,问题就出现了,下面的代码再现了这个问题,它在iOS 14上运行时可以工作,但在iOS 13上不会产生结果,但是如果从修饰符中删除“#available”(可用)条件,只留下iOS 13代码,它就会按预期工作。在AnyView中包装iOS 14也无济于事:

    extension View {
        @ViewBuilder
        func configuresIcon() -> some View {
            if #available(iOS 14.0, *){
                self.modifier(NavigationConfigurationView14Modifier())
            } else {
                self.modifier(NavigationConfigurationViewModifier(configure: { nv in
                    nv.topItem?.titleView = UIImageView(image: UIImage(named: IMAGE_NAME_HERE))
                }))
            }
        }
    }
    
    
    struct NavigationConfigurationViewModifier: ViewModifier {
        let configure: (UINavigationBar) -> ()
        
        func body(content: Content) -> some View {
            content.background(NavigationControllerLayout(configure: {
                configure($0.navigationBar)
            }))
        }
    }
    
    @available(iOS 14.0, *)
    struct NavigationConfigurationView14Modifier: ViewModifier {
        func body(content: Content) -> some View {
            content
                .toolbar {
                    ToolbarItem(placement: .principal) {
                        Image(IMAGE_NAME_HERE)
                    }
                }
        }
    }

    struct NavigationControllerLayout: UIViewControllerRepresentable {
        var configure: (UINavigationController) -> () = { _ in }
        
        func makeUIViewController(
            context: UIViewControllerRepresentableContext<NavigationControllerLayout>
        ) -> UIViewController {
            UIViewController()
        }
        
        func updateUIViewController(
            _ uiViewController: UIViewController,
            context: UIViewControllerRepresentableContext<NavigationControllerLayout>
        ) {
            if let navigationContoller = uiViewController.navigationController {
                configure(navigationContoller)
            }
        }
    }
扩展视图{
@视图生成器
func configuresIcon()->某些视图{
如果可用(iOS 14.0,*){
self.modifier(NavigationConfigurationView14Modifier())
}否则{
self.modifier(NavigationConfigurationViewModifier)(配置:{nv in
nv.topItem?.titleView=UIImageView(图像:UIImage(名称:image\u NAME\u此处))
}))
}
}
}
结构导航配置视图修改器:视图修改器{
让我们配置:(UINavigationBar)->()
func正文(内容:内容)->某些视图{
content.background(导航控制器布局)(配置:{
配置($0.navigationBar)
}))
}
}
@可用(iOS 14.0,*)
结构导航配置View14修改器:ViewModifier{
func正文(内容:内容)->某些视图{
内容
.工具栏{
工具栏项(位置:。主体){
图像(此处的图像名称)
}
}
}
}
结构导航控制器布局:UIViewControllerRepresentable{
变量配置:(UINavigationController)->()={uuin}
func makeUIViewController(
上下文:UIViewControllerRepresentableContext
)->UIViewController{
UIViewController()
}
func updateUIViewController(
_uiViewController:uiViewController,
上下文:UIViewControllerRepresentableContext
) {
如果让navigationController=uiViewController.navigationController{
配置(导航控制器)
}
}
}

尝试将内容包装在
组中(未测试-仅限idea)


尝试将内容包装在
组中
(未测试-仅限idea)


如果我们在运行时检查操作系统版本,而不是在编译时(因为
buildlimitedavailability(:)
本身就是可用的),它可能会起作用


如果我们在运行时检查操作系统版本,而不是在编译时(因为
buildlimitedavailability(:)
本身就是可用的),它可能会起作用

extension View {
    @ViewBuilder
    func configuresIcon() -> some View {
      Group {
        if #available(iOS 14.0, *){
            self.modifier(NavigationConfigurationView14Modifier())
        } else {
            self.modifier(NavigationConfigurationViewModifier(configure: { nv in
                nv.topItem?.titleView = UIImageView(image: UIImage(named: IMAGE_NAME_HERE))
            }))
        }
     }
   }
}
 extension View {
    func erase() -> AnyView {
        return AnyView(self)
    }
    func applyIf<VM1: ViewModifier, VM2: ViewModifier>(_ condition: @autoclosure () -> Bool, ApplyIfTrue: VM1, ApplyIfFalse: VM2
) -> AnyView {
         if condition() {
            return self.modifier(ApplyIfTrue).erase()
         } else {
            return self.modifier(ApplyIfFalse).erase()
         }
     }
    
    @ViewBuilder func configuresIcon() -> some View {
        self.applyIf(NSProcessInfo().isOperatingSystemAtLeastVersion(NSOperatingSystemVersion(majorVersion: 14, minorVersion: 0, patchVersion: 0)),
                     ApplyIfTrue: NavigationConfigurationView14Modifier(),
                     ApplyIfFalse: modifier(NavigationConfigurationViewModifier(configure: { nv in
                        nv.topItem?.titleView = UIImageView(image: UIImage(named: IMAGE_NAME_HERE))
                     })))
       }
 }
@available(macOS 10.15, iOS 13.0, *)
struct ContentView: View {
    var body: some View {
        ScrollView {
            if #available(macOS 11.0, iOS 14.0, *) {
                LazyVStack {
                    ForEach(1...1000, id: \.self) { value in
                        Text("Row \(value)")
                    }
                }
            } else {
                VStack {
                    ForEach(1...1000, id: \.self) { value in
                        Text("Row \(value)")
                    }
                }
            }
        }
    }
}