xcode 静态方法“buildBlock”要求“ToolbarItem< Void,Text>”符合“View”

bgibtngc  于 2023-11-21  发布在  其他
关注(0)|答案(2)|浏览(118)

我支持iOS 13及更高版本。我希望在使用iOS 14及更高版本的设备中使用新的.toolbar修饰符作为可选功能。我使用的是Xcode 13.0 RC 1,build 13A233,但Xcode 12.5.1也出现了这个问题。我创建了以下代码:

import SwiftUI

struct MyToolbar<T>: ViewModifier where T: View {
    let toolbarContent: () -> T
    
    func body(content: Content) -> some View {
        if #available(iOS 14.0, *) {
            content
                .toolbar(content: self.toolbarContent)
        }
    }
}

extension View {
    func myToolbar<T: View>(@ViewBuilder content: @escaping () -> T) -> some View {
        self.modifier(MyToolbar(toolbarContent: content))
    }
}

struct MyToolbar_Previews: PreviewProvider {
    static var previews: some View {
        NavigationView {
            Text("Hello, world")
                .myToolbar {
                    if #available(iOS 14.0, *) {
                        Text("Hello, world!")
//                        ToolbarItem(placement: .bottomBar) {
//                            Text("Hello, world!")
//                        }
                    } else {
                        EmptyView()
                    }
                }
        }
    }
}

字符串
我已经包含了预览位,所以上面的内容可以粘贴到任何Xcode SwiftUI项目的空文件中。它可以工作。当我取消注解ToolbarItem语句时,我得到以下错误:

Static method 'buildBlock' requires that 'ToolbarItem<Void, Text>' conform to 'View'
Static method 'buildLimitedAvailability' requires that 'ToolbarItem<Void, Text>' conform to 'View'


如何修复这些错误?

0lvr5msh

0lvr5msh1#

我认为主要的问题是.toolbar修饰符的块被定义为返回符合ToolbarContent协议的东西。来自the docs

func toolbar<Content>(content: () -> Content) -> some View where Content : ToolbarContent

字符串
因此,在视图修改器中,

func body(content: Content) -> some View {
    if #available(iOS 14.0, *) {
        content
            .toolbar(content: self.toolbarContent)
    }
}


.您需要确保self.toolbarContent匹配() -> ToolbarContent类型签名。
通过浏览您的代码,我倾向于首先尝试将T的一致性从T: View更改为T: ToolbarContent

rggaifut

rggaifut2#

您可以使用@ToolbarContentBuilder

extension View {

    @ToolbarContentBuilder
    func toolbarContent() -> some ToolbarContent {
        ...
    }

字符串
你可以像这样添加你的扩展

func body(content: Content) -> some View {
        if #available(iOS 14.0, *) {
            content
                .toolbar(content: self.toolbarContent)
        }
}

相关问题