Xcode: Интерфейсный Разработчик, использующий неправильное назначение, чтобы сделать IBDesignable - PullRequest
1 голос
/ 08 февраля 2020

Среда

  • macOS: 10.15.3
  • Xcode: 11.3.1
    • Swift: 5.1
    • Цель приложения: macOS

Фон

У меня есть элемент управления IBDesignable на основе NSView (или UIView в зависимости от желаемой цели). Я упаковал его с помощью диспетчера пакетов следующим образом:

// swift-tools-version:5.1
// The swift-tools-version declares the minimum version of Swift required to build this package.

import PackageDescription

let package = Package(
    name: "MyControl",
    platforms: [
        .macOS(.v10_13),
        .iOS(.v10)
    ],
    products: [
        // Products define the executables and libraries produced by a package, and make them visible to other packages.
        .library(
            name: "MyControl",
            targets: ["MyControl"]),
    ],
    dependencies: [
        // Dependencies declare other packages that this package depends on.
        // .package(url: /* package url */, from: "1.0.0"),
    ],
    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 which this package depends on.
        .target(
            name: "MyControl",
            dependencies: []),
        .testTarget(
            name: "MyControl Tests",
            dependencies: ["MyControl"]),
    ]
)

Как часть "MyControl", у меня есть следующие typealiases, основанные на желаемой цели назначения

#if os(macOS)
    import AppKit
    public typealias QJViewController = NSViewController
    public typealias QJColor = NSColor
    public typealias QJFont = NSFont
    public typealias QJView = NSView
#elseif os(iOS) || os(tvOS)
    import UIKit
    public typealias QJViewController = UIViewController
    public typealias QJColor = UIColor
    public typealias QJFont = UIFont
    public typealias QJView = UIView
#endif

Пакет успешно компилируется ; контроль импортирует в мой целевой проект правильно; все компилируется и функционирует, как и ожидалось в целевом проекте.

Проблема

Когда я настраиваю элемент управления в InterfaceBuilder, он не может отобразиться со следующей ошибкой:

enter image description here

Повторюсь: моя цель , а не appleTV, это macOS. Независимо от того, что я делаю, IB хочет сделать этот пакет и, следовательно, мой контроль, AppleTV в качестве пункта назначения. Принимая во внимание типизацию, которую я использую выше, элемент управления не может правильно отображаться, потому что (очевидно) macOS ничего не знает о UIColor, UIFont, UIView, UIViewController.

Вопрос

Есть ли способ заставить IB использовать определенный пункт назначения при отображении элемента управления? Если нет, то чего-то не хватает в настройках моего проекта? Как я уже сказал, управление работает, как и ожидалось; Я просто хотел бы сделать это в IB.

1 Ответ

1 голос
/ 06 марта 2020

`При условии, что материалов недостаточно для проверки проблемы, просто предложение - попробуйте вместо этого следующее условное отображение

#if canImport(AppKit)
    import AppKit
    public typealias QJViewController = NSViewController
    public typealias QJColor = NSColor
    public typealias QJFont = NSFont
    public typealias QJView = NSView
#elseif canImport(UIKit)
    import UIKit
    public typealias QJViewController = UIViewController
    public typealias QJColor = UIColor
    public typealias QJFont = UIFont
    public typealias QJView = UIView
#endif
...