Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SwiftUI:可重用跨平台(iOS和macOS)视图中的导航栏标题_Swift_Macos_Frameworks_Swiftui_Navigationbar - Fatal编程技术网

SwiftUI:可重用跨平台(iOS和macOS)视图中的导航栏标题

SwiftUI:可重用跨平台(iOS和macOS)视图中的导航栏标题,swift,macos,frameworks,swiftui,navigationbar,Swift,Macos,Frameworks,Swiftui,Navigationbar,我正在尝试为一个框架创建可重用的SwiftUI视图,然后可以在iOS/iPadOS和macOS中使用 这通常效果很好;但是,由于macOS视图没有导航栏,因此当视图包含在macOS目标中时,包含导航栏标题(对于iOS很重要)会导致错误: .navigationBarTitle(文本(“页面标题”)) 类型为“…”的值没有成员“navigationBarTitle” 关于允许为两个平台构建相同视图的条件编译(或任何其他)方法有何建议 我最接近的是以下几点。包含额外的文本视图很容易,但由于条形标题是

我正在尝试为一个框架创建可重用的SwiftUI
视图
,然后可以在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