标签: swiftui-previews

SwiftUI 预览布局:适合的尺寸不起作用

我希望我的预览只显示视图的大小,而不显示整个 iPhone。我已经用这段代码尝试过了:

struct TimerCardView: View {
   
    
    var body: some View {
        Text("Hello, World!")
            .padding()
            .background(.gray)
    }
}


struct TimerCardView_Previews: PreviewProvider {
    static var previews: some View {
        TimerCardView()
            .previewLayout(.sizeThatFits)
    }
}
Run Code Online (Sandbox Code Playgroud)

但什么也没发生。我究竟做错了什么?我很感激帮助

xcode swiftui swiftui-previews

17
推荐指数
2
解决办法
5275
查看次数

SwiftUI 中的更好性能:创建新视图或使用带有 @ViewBuilder 的函数

在 SwiftUI 中使用不同的视图组合时,我们可以采取两种方法:

  1. 要在视图内使用一些 @ViewBuilder 函数作为辅助函数:
@ViewBuilder func makeButtonLabel() -> some View {
    if isPlaying {
        PauseIcon()
    } else {
        PlayIcon()
    }
}
Run Code Online (Sandbox Code Playgroud)
  1. 要为该 UI 部分创建不同的视图:
struct SongRow: View {
    var song: Song
    @Binding var isPlaying: Bool
    ...

    var body: some View {
        HStack {
            if isPlaying {
                PauseIcon()
            } else {
                PlayIcon()
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我想知道哪一个更好,我们如何衡量它?

从分析上来说,在我看来,第二个在更大的视图块中具有更好的性能,特别是我们可以在预览的加载时间中看到它,但我对此没有任何线索。

xcode swift swiftui swiftui-previews

10
推荐指数
1
解决办法
2250
查看次数

SwiftUI 预览打开麦克风

有谁知道如何阻止 swiftUI 预览打开麦克风?我在工作时戴着蓝牙耳机,每次预览启动时都会启用麦克风。这会降低我的音频质量,因为耳机会在播放和输入之间分配带宽。

我的解决方法是进入声音设置,然后将我的默认输入切换到我的网络摄像头或 macbook 本身。每次启用时,xcode 中的预览都会打开麦克风,这太奇怪了。

上下文:我有一个 MBP 2019 Xcode 12.4 Catalina

谢谢!

swift swiftui macos-catalina xcode12 swiftui-previews

8
推荐指数
1
解决办法
199
查看次数

Xcode 无法使用 Swift Package 生成预览

由于我添加到项目中的 Swift 包,我收到此错误。

HumanReadableSwiftError

SettingsError: noExecutablePath(<IDESwiftPackageStaticLibraryProductBuildable:ObjectIdentifier(0x000060001598bf60):'PersonaInquirySDK2'>)
Run Code Online (Sandbox Code Playgroud)

这是包裹。

https://github.com/persona-id/inquiry-ios-2.git

这是我可以修复的问题,还是帮助 Xcode 忽略预览?

xcode swift-package-manager swiftui swiftui-previews

8
推荐指数
0
解决办法
996
查看次数

加载 SwiftUI 预览时阻止 AppKit 主应用程序窗口打开

我有一个 Mac 应用程序,主要是用 AppKit 编写的。随着时间的推移,我在 SwiftUI 中添加新视图,并且一直使用 SwiftUI 预览来预览新的 SwiftUI 视图和旧的 AppKit 视图/视图控制器(请参阅预览不仅仅适用于 SwiftUI 视图)。

我遇到的一个麻烦是启动 SwiftUI 预览会打开我的应用程序的主窗口。这是预览如何通过常规启动流程的结果,例如调用applicationDidFinishLaunching(_:)我的应用程序代理,这是我在启动时实例化并显示应用程序主窗口的地方。当然,如果我在预览中处理视图,我不希望发生这种情况。

我的 AppDelegate 如下所示:

@NSApplicationMain
public class AppDelegate: NSObject, NSApplicationDelegate {
    lazy var mainWindowController = MainWindowController()

    public func applicationDidFinishLaunching(_ aNotification: Notification) {
        // Nasty hack :(
        let isInSwiftUIPreview = ProcessInfo.processInfo.environment["XCODE_RUNNING_FOR_PREVIEWS"] == "1"

        if !isRunningInTest() && !isInSwiftUIPreview {
            mainWindowController.showWindow(self)
        }
    }

    // ...
}
Run Code Online (Sandbox Code Playgroud)

如您所见,如果此代码在测试或 SwiftUI 预览中运行,我添加了不显示主窗口的特殊情况。这味道让我觉得我做错了。

事实上,Apple 在Mastering Xcode Previews 的41:41 中提到了这个确切的问题。他们建议让您的应用程序具有场景感知能力,并使用 aUISceneDelegate来完成这项工作。然而,这是一个仅限 iOS/catalyst 的 …

appkit nsapplication-delegate swift swiftui swiftui-previews

7
推荐指数
0
解决办法
396
查看次数

SwiftUI 预览表不运行实时预览?

更新 Xcode 13 下面的代码示例在 Xcode 13 中按预期工作。

Apple 框架工程师2020 年 10 月更新:

不幸的是,当前没有解决方法可以让您在实时预览之外预览此内容。


是否可以在不运行实时预览的情况下创建所呈现工作表的 SwiftUI 预览?例如:

struct Sheet_Previews: PreviewProvider {
    static var previews: some View {
        Text("Background").sheet(isPresented: .constant(true)) {
            Text("Sheet")
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

上述结果产生以下预览:

在此输入图像描述

为了在预览中显示工作表内容,您必须运行实时预览:

在此输入图像描述

swiftui xcode-previews swiftui-previews

6
推荐指数
1
解决办法
1704
查看次数

带有框架的模块化应用程序中的 Swift UI 预览

在我的框架内运行SwiftUI视图预览时遇到问题。\n这是一个项目结构。在此输入图像描述

\n

主目标(ContentViewGradientView)中的 SwiftUI 视图预览按预期工作。

\n

但是,当我\xe2\x80\x99m 尝试预览UI.xcodeprojectSwiftUIView )内的视图时,我\xe2\x80\x99m 收到错误

\n

在此输入图像描述

\n
PotentialCrashError: Update failed\n\nXCPreviewAgent may have crashed. Check ~/Library/Logs/DiagnosticReports for any crash logs from your application.\n\n==================================\n\n|  RemoteHumanReadableError\n|  \n|  LoadingError: failed to load library at path "/Users/yevgeniy/Library/Developer/Xcode/DerivedData/Hackathon-abjguuvpzyisdncwvpeguazdifiu/Build/Intermediates.noindex/Previews/Hackathon/Intermediates.noindex/UI.build/Debug-iphonesimulator/UI.build/Objects-normal/x86_64/SwiftUIView.1.preview-thunk.dylib": Optional(dlopen(/Users/yevgeniy/Library/Developer/Xcode/DerivedData/Hackathon-abjguuvpzyisdncwvpeguazdifiu/Build/Intermediates.noindex/Previews/Hackathon/Intermediates.noindex/UI.build/Debug-iphonesimulator/UI.build/Objects-normal/x86_64/SwiftUIView.1.preview-thunk.dylib, 0x0002): tried: \'/Users/yevgeniy/Library/Developer/Xcode/DerivedData/Hackathon-abjguuvpzyisdncwvpeguazdifiu/Build/Intermediates.noindex/Previews/Hackathon/Products/Debug-iphonesimulator/SwiftUIView.1.preview-thunk.dylib\' (errno=2), \'/Applications/Xcode_14.0.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/Users/yevgeniy/Library/Developer/Xcode/DerivedData/Hackathon-abjguuvpzyisdncwvpeguazdifiu/Build/Intermediates.noindex/Previews/Hackathon/Intermediates.noindex/UI.build/Debug-iphonesimulator/UI.build/Objects-normal/x86_64/SwiftUIView.1.preview-thunk.dylib\' (errno=2), \'/Users/yevgeniy/Library/Developer/Xcode/DerivedData/Hackathon-abjguuvpzyisdncwvpeguazdifiu/Build/Intermediates.noindex/Previews/Hackathon/Intermediates.noindex/UI.build/Debug-iphonesimulator/UI.build/Objects-normal/x86_64/SwiftUIView.1.preview-thunk.dylib\' (mach-o file, but is an incompatible architecture (have \'x86_64\', need \'arm64\')))\n|  \n|  ==================================\n|  \n|  |  MessageSendFailure: Message send failure for <ServiceMessage 115: update>\n
Run Code Online (Sandbox Code Playgroud)\n

~/Library/Logs/DiagnosticReports 文件夹为空。

\n

在 …

swiftui swiftui-previews

6
推荐指数
1
解决办法
1014
查看次数

SwiftUI Preview 找不到所用框架的图像

我的项目由一个主要的 iOS 应用程序项目和三个用于表示层、域层和数据层的附加框架组成。我自己的框架嵌入在主要目标中。第三方框架由 CocoaPods 管理并动态链接。

现在,如果我尝试预览我的代码,则会收到以下错误:

RemoteHumanReadableError: Failed to update preview.

Error encountered when sending 'previewInstances' message to agent.

==================================

|  RemoteHumanReadableError
|  
|  LoadingError: failed to load library at path "/Users/lucas/Library/Developer/Xcode/DerivedData/Envim-grqjeyyonytbnxcujdcadldmkoni/Build/Intermediates.noindex/Previews/Envim (iOS)/Products/Debug-iphonesimulator/Presentation.framework/Presentation": Optional(dlopen(/Users/lucas/Library/Developer/Xcode/DerivedData/Envim-grqjeyyonytbnxcujdcadldmkoni/Build/Intermediates.noindex/Previews/Envim (iOS)/Products/Debug-iphonesimulator/Presentation.framework/Presentation, 0): Library not loaded: @rpath/Resolver.framework/Resolver
|    Referenced from: /Users/lucas/Library/Developer/Xcode/DerivedData/Envim-grqjeyyonytbnxcujdcadldmkoni/Build/Intermediates.noindex/Previews/Envim (iOS)/Products/Debug-iphonesimulator/Presentation.framework/Presentation
|    Reason: image not found)
Run Code Online (Sandbox Code Playgroud)

我希望我包含了所有相关信息。如果我忘记了什么,请随时索取。

xcode swift swift-framework xcode-previews swiftui-previews

5
推荐指数
0
解决办法
912
查看次数

有没有办法让 SwiftUI 预览忽略特定文件以防止再次构建?

我们的 SwiftUI 项目中有一个 MLPackage 文件。每当我们尝试在视图文件上加载预览时,Xcode 就会陷入“构建预览”的无限循环中。构建成功,但立即开始另一个构建。因此,无法实际查看/使用预览。

重复构建

注意:警告不相关。

检查控制台日志(不在 Xcode 中)显示以下内容:

Xcode (PreviewsPipeline)
=== Requesting updating previews for reasons [
    File "foo.mlpackage" changed,
    Preview Settings changed,
]
Run Code Online (Sandbox Code Playgroud)

将模型完全从项目中取出可以解决这个问题,所以我很确定它们就是原因。我们还在编译时对模型进行加密,但这对于调试版本是禁用的。我们还尝试完全删除加密步骤,但没有感到高兴。

据我(不太)理解,mlpackage 包含元数据、描述拓扑的 .mlmodel 文件以及包含 NN 权重的压缩的weights.bin。我对该文件中“变化”的猜测是运行时执行一些预编译或解压缩并将结果存储在该包/文件中。

有没有办法告诉 SwiftUI 预览忽略某些文件、目录或模式?

这样,mlpackage 文件可以更改,并且不会重建预览。

M1 Mac Mini,Xcode 14.2 (14C18)

xcode coreml swiftui swiftui-previews

5
推荐指数
0
解决办法
772
查看次数

SwiftUI -&gt; 线程 1:致命错误:找不到 ModelData 类型的 ObservableObject

我使用 SwiftUI 创建了一个应用程序,当我尝试显示按钮时,会出现以下错误消息:

Thread 1: Fatal error: No ObservableObject of type ModelData found. A View.environmentObject(_:) for ModelData may be missing as an ancestor of this view.
Run Code Online (Sandbox Code Playgroud)

当我尝试使用 an@EnvironmentObject尝试显示我的应用程序的视图之一时,会发生这种情况。

我的代码是

struct OpportunityDetail: View {
    @EnvironmentObject var modelData: ModelData
    var opportunity: Opportunity
    
    var opportunityIndex: Int {
            modelData.opportunities.firstIndex(where: { $0.id == opportunity.id })!
        }
    
    
    var body: some View {
        ScrollView {
            
            MapView(coordinate: opportunity.locationCoordinate)
                .frame(height: 300)
                .ignoresSafeArea(edges: .top)
            
            CircleImage(opportunity: opportunity)
                .offset(y: -130)
                .padding(.bottom, -130)
            
            
            VStack {
                VStack(alignment: .leading) {
                    Text(opportunity.position)
                        .font(.title)
                    HStack …
Run Code Online (Sandbox Code Playgroud)

swift swiftui swiftui-environment swiftui-previews

2
推荐指数
1
解决办法
1646
查看次数

Xcode SwiftUI 预览构建设置

我正在使用方案运行预构建脚本。我的脚本启用了从正在构建的目标提供构建设置的选项。当为 SwiftUI 预览构建项目时,也会执行此脚本。我需要知道这个脚本中正在运行的构建是常规构建还是预览构建。有没有办法做到这一点以及如何做到?

我尝试export在这两种情况下在脚本中运行,但似乎两种情况下所有环境变量都是相同的。

xcode xcodebuild swiftui xcode-build-settings swiftui-previews

2
推荐指数
1
解决办法
2153
查看次数

预览 SwiftUI 私有非默认@State

SwiftUI 状态属性应声明为 private。这对于从包含视图中封装它们的值很有用,但会阻止预览使用默认初始值设定项设置非默认状态。例如,这不会编译:

struct TemperatureView: View {
    @State private var isHot = false
    
    var body: some View {
        Text(isHot ? "Hot" : "Cold")
    }
}

struct TemperatureView_Previews: PreviewProvider {
    static var previews: some View {
        Group {
            TemperatureView(isHot: true)
            TemperatureView(isHot: false)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

替换privatefileprivate会导致相同的错误。如何预览私有视图状态?

swiftui swiftui-previews

1
推荐指数
1
解决办法
880
查看次数