我支持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'
型
如何修复这些错误?
2条答案
按热度按时间0lvr5msh1#
我认为主要的问题是
.toolbar
修饰符的块被定义为返回符合ToolbarContent
协议的东西。来自the docs:字符串
因此,在视图修改器中,
型
.您需要确保
self.toolbarContent
匹配() -> ToolbarContent
类型签名。通过浏览您的代码,我倾向于首先尝试将
T
的一致性从T: View
更改为T: ToolbarContent
。rggaifut2#
您可以使用
@ToolbarContentBuilder
字符串
你可以像这样添加你的扩展
型