我支持 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/