ios - Xcode 12 - 当有另一个 Swift 包作为依赖项时,SwiftUI 预览在 Swift 包上不起作用 - 'previewInstances' 给代理的消息

标签 ios swift xcode swiftui swift-package-manager

当我的代码从其他 swift 包中导入控件或值时,我在位于 Swift 包中的 View 中出现 SwiftUI 预览问题。

import Foundation
import SwiftUI
import Common

struct AppointmentListItem: View {
    var appointment: Appointment
    var body: some View {
        VStack{
            HStack(spacing: 10){
               //Client Info
                Image(self.appointment.client.profilePicture)
                   .resizable()
                   .aspectRatio(contentMode: .fill)
                   .frame(width: 35, height: 35)
                   .clipShape(Circle())
                   .shadow(radius: 10)
                   .overlay(Circle().stroke(Color.white, lineWidth: 1.5))
                Text(self.appointment.client.fullName)
                   .font(.system(size: 18))
                   .bold()
                   .frame(maxWidth: .infinity, alignment: .leading)
                Text(self.appointment.getHourAndMinutes()).bold()
               //Detail info
               Button(action: {
                   withAnimation{
                       print("Go to details")
                   }
               }){
                   Image(systemName: "ellipsis")
                       .font(.system(size: 18))
                       .frame(width: 20, height: 20)
                    .rotationEffect(Angle.init(degrees: 90))
               }
            }
            .padding()
        }
        .foregroundColor(Color.white)
        .background(RoundedRectangle(cornerRadius: 20)
                        .fill(Color.hippoPrimary)// <- this color is part of Common package
        )
    }
}
如果我删除或更改 .fill(Color.hippoPrimary)预览可用。
Xcode提供的错误如下:
RemoteHumanReadableError: Failed to update preview.

The preview process appears to have crashed.

Error encountered when sending 'previewInstances' message to agent.

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

|  RemoteHumanReadableError: The operation couldn’t be completed. (BSServiceConnectionErrorDomain error 3.)
|  
|  BSServiceConnectionErrorDomain (3):
|  ==BSErrorCodeDescription: OperationFailed
这是我的 Package.swift 文件:
// swift-tools-version:5.3
// The swift-tools-version declares the minimum version of Swift required to build this package.

import PackageDescription

let package = Package(
    name: "TodayAppointments",
    platforms: [
        .iOS(.v13)
    ],
    products: [
        // Products define the executables and libraries a package produces, and make them visible to other packages.
        .library(
            name: "TodayAppointments",
            targets: ["TodayAppointments"]),
    ],
    dependencies: [
        // Dependencies declare other packages that this package depends on.
        // .package(url: /* package url */, from: "1.0.0"),
        .package(path: "../Common")
    ],
    targets: [
        // Targets are the basic building blocks of a package. A target can define a module or a test suite.
        // Targets can depend on other targets in this package, and on products in packages this package depends on.
        .target(
            name: "TodayAppointments",
            dependencies: ["Common"]),
        .testTarget(
            name: "TodayAppointmentsTests",
            dependencies: ["TodayAppointments"]),
    ]
)
在通用包中,颜色是这样定义的:
public extension Color {
    static let hippoPrimary = Color("Primary", bundle: .module)
    static let progressBarBackground = Color("ProgressBarBackground", bundle: .module)
    static let textBackground = Color("TextBackground", bundle: .module)
    static let textColor = Color("TextColor", bundle: .module)
    static let appleSignInBackground = Color("AppleSignInBackground", bundle: .module)
    static let buttonActionText = Color("Text", bundle: .module)
}
构建没有错误,所以我知道依赖项没问题,听起来像一个 IDE。
提前致谢。

最佳答案

iOS 和 macOS 的解决方法(未经 Catalyst 测试):

extension Foundation.Bundle {
    static var swiftUIPreviewsCompatibleModule: Bundle {
        final class CurrentBundleFinder {}

        /* The name of your local package, prepended by "LocalPackages_" for iOS and "PackageName_" for macOS. You may have same PackageName and TargetName*/
        let bundleNameIOS = "LocalPackages_TargetName"
        let bundleNameMacOs = "PackageName_TargetName"

        let candidates = [
            /* Bundle should be present here when the package is linked into an App. */
            Bundle.main.resourceURL,

            /* Bundle should be present here when the package is linked into a framework. */
            Bundle(for: CurrentBundleFinder.self).resourceURL,

            /* For command-line tools. */
            Bundle.main.bundleURL,

            /* Bundle should be present here when running previews from a different package (this is the path to "…/Debug-iphonesimulator/"). */
            Bundle(for: CurrentBundleFinder.self).resourceURL?.deletingLastPathComponent().deletingLastPathComponent().deletingLastPathComponent(),
            Bundle(for: CurrentBundleFinder.self).resourceURL?.deletingLastPathComponent().deletingLastPathComponent(),
        ]

        for candidate in candidates {
            let bundlePathiOS = candidate?.appendingPathComponent(bundleNameIOS + ".bundle")
            let bundlePathMacOS = candidate?.appendingPathComponent(bundleNameMacOs + ".bundle")

            if let bundle = bundlePathiOS.flatMap(Bundle.init(url:)) {
                return bundle
            } else if let bundle = bundlePathMacOS.flatMap(Bundle.init(url:)) {
                return bundle
            }
        }

        fatalError("unable to find bundle")
    }
}

然后替换对 Bundle.module 的调用与 Bundle.swiftUIPreviewsCompatibleModule .

关于ios - Xcode 12 - 当有另一个 Swift 包作为依赖项时,SwiftUI 预览在 Swift 包上不起作用 - 'previewInstances' 给代理的消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64540082/

相关文章:

ios - 使用 UITableView 中单元格中的文本

ios - 从 Objective C 访问 Swift 数组

ios - 在 Swift 中将图像发送到 ViewController 的多个实例

json - 迭代数组以填充 tableviewcells 的 Swift 方法

iphone - 当 unicode 文本在 iPhone 中的字符串中时字符串的高度

xcode - Apple TV无线调试无法连接

ios - 在 iOS 上使用 Crashlytics 是否需要 Firebase pod?

ios - 在 Xcode 中存档时找不到模块,但在 "Run"期间找到模块

ios - 查找最大计数项目列表

ios uibutton 添加目标,从同一 View 传递给选择器参数