SwiftUI:可重用跨平台(iOS和macOS)视图中的导航栏标题
我正在尝试为一个框架创建可重用的SwiftUISwiftUI:可重用跨平台(iOS和macOS)视图中的导航栏标题,swift,macos,frameworks,swiftui,navigationbar,Swift,Macos,Frameworks,Swiftui,Navigationbar,我正在尝试为一个框架创建可重用的SwiftUI视图,然后可以在iOS/iPadOS和macOS中使用 这通常效果很好;但是,由于macOS视图没有导航栏,因此当视图包含在macOS目标中时,包含导航栏标题(对于iOS很重要)会导致错误: .navigationBarTitle(文本(“页面标题”)) 类型为“…”的值没有成员“navigationBarTitle” 关于允许为两个平台构建相同视图的条件编译(或任何其他)方法有何建议 我最接近的是以下几点。包含额外的文本视图很容易,但由于条形标题是
视图
,然后可以在iOS/iPadOS和macOS中使用
这通常效果很好;但是,由于macOS视图没有导航栏,因此当视图包含在macOS目标中时,包含导航栏标题(对于iOS很重要)会导致错误:
.navigationBarTitle(文本(“页面标题”))
类型为“…”的值没有成员“navigationBarTitle”
关于允许为两个平台构建相同视图的条件编译(或任何其他)方法有何建议
我最接近的是以下几点。包含额外的文本
视图很容易,但由于条形标题是一个修饰符,在条件编译中仅包装该部分会产生其他错误:
public struct ExampleView: View {
private let pageTitle = "Page Title"
public var body: some View {
VStack(alignment: .center) {
#if os(macOS)
Text(pageTitle)
.font(.title)
#endif
Spacer()
Text("This is the view content")
Spacer()
}
#if !os(macOS)
.navigationBarTitle(Text(pageTitle))
#endif
}
}
意外的平台条件(预期为“os”、“arch”或“swift”)
函数声明了一个不透明的返回类型,但在其主体中没有可以推断基础类型的返回语句
我建立了一种方法:将主要内容移动到另一个
视图
属性,然后修改它以添加导航栏标题(如果需要),然后将其作为正文
返回。当它以这种方式分离时,可以使用条件编译
这有点不雅观,但很管用。它还可以用于设置macOS特定的内容,例如视图的总体帧大小。欢迎就更好的方法提出建议
Swift v5.1
public struct ExampleView: View {
private let pageTitle = "Page Title"
#if !os(macOS)
public var body: some View {
main.navigationBarTitle(Text(pageTitle))
}
#else
public var body: some View {
main.frame(
minWidth: 500,
minHeight: 500
)
}
#endif
public var main: some View {
VStack(alignment: .center) {
#if os(macOS)
Text(pageTitle)
.font(.title)
#endif
Spacer()
Text("This is the view content")
Spacer()
}
}
}
您可以向视图结构添加扩展。它将把条件编译放在块之外,并按预期工作
#if os(macOS)
extension View {
func navigationBarTitle(_ title: Text) -> some View {
return self
}
}
#endif