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

标签 xcode swiftui

我支持 iOS 13 及更高版本。我希望在使用 iOS 14 及更高版本的设备中使用新的 .toolbar 修饰符作为可选功能。我使用的是 Xcode 13.0 RC 1,内部版本 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'

如何修复这些错误?

最佳答案

我认为主要问题是 .toolbar 修饰符的 block 被定义为返回符合 ToolbarContent 协议(protocol)的内容。来自 the docs :

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

因此,在您的 View 修改器中

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

...您需要确保 self.toolbarContent() -> ToolbarContent 类型签名匹配。

仅看一下您的代码,我倾向于首先尝试将 T 的一致性从 T: View 更改为 T: ToolbarContent.从眼睛看来,这可能已经足够了,但您可能需要做更多的工作来整理所有内容。

关于xcode - 静态方法 'buildBlock'要求 'ToolbarItem<Void, Text>'符合 'View',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69252625/

相关文章:

objective-c - 从另一个 View Controller 调用 int 变量

ios - Travis CI 的完整 Xcode 版本和设备名称/操作系统列表?

animation - SwiftUI 动画滑入滑出

swiftui - 使用 vstack 的全屏背景图像

alignment - SwiftUI 自定义对齐使 View 比父 View 更宽

iphone - 如何将 Cocos2d 应用程序缩放到 iPhone 5 屏幕?

c++ - 从 Xcode 转换为 CMake

objective-c - Objective-C 的 Playground

swift - SwiftUI 中 View 的大小

swiftui - 如何使用 SwiftUI 禁用整个应用程序或仅 View 上的多点触控?