【问题标题】:Do Swift screensavers work in Mac OS X before Yosemite?在优胜美地之前,Swift 屏幕保护程序是否可以在 Mac OS X 中使用?
【发布时间】:2015-01-14 22:09:38
【问题描述】:

我将 Xcode 从 Objective-C 生成的屏幕保护程序模板重写为 Swift,当我尝试加载它时,我收到以下消息:

您不能在此版本的 MacOSX 中使用 BlahBlah 屏幕保护程序。

请联系供应商获取新版本的屏幕保护程序。

我目前正在经营小牛队。这是否意味着 Swift 屏幕保护程序只能在 Yosemite 中使用,或者甚至不在那里?

这是我用来替换 Objetive-C 的 Swift 代码:

import Foundation
import ScreenSaver

class BlahBlahView : ScreenSaverView {
    convenience override init() {
        self.init(frame: CGRectZero, isPreview: false)
    }

    override init(frame: NSRect, isPreview: Bool) {
        super.init(frame: frame, isPreview: isPreview)

        setAnimationTimeInterval(1.0 / 30.0)
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }


    override func startAnimation() {
        super.startAnimation()
    }

    override func stopAnimation() {
        super.stopAnimation()
    }

    override func drawRect(rect: NSRect) {
        super.drawRect(rect)
    }

    override func animateOneFrame() {

    }

    override func hasConfigureSheet() -> Bool {
        return false
    }

    override func configureSheet() -> NSWindow? {
        return nil
    }
}

这些是我的项目设置:

这最初是在 MacOSX 10.9 上创建的 Objective-C 项目(没有 Swift Screensaver 模板),而我使用的 API Screensaver 已经存在多年了。

【问题讨论】:

  • 你能在你的 OS X 上运行任何在 Xcode 之外用 Swift 构建的应用程序吗?
  • @BrandonBuck 是的,我可以。
  • @Rob 我认为我没有使用 10.10 API。它甚至会编译吗?我也找不到 OS X 部署目标,但它与屏幕保护程序模板中生成的相同。我在那里没有改变任何东西。我将发布项目设置的屏幕截图。
  • 你知道你的问题被复制了there吗?

标签: macos swift osx-mavericks screensaver


【解决方案1】:

要在 Mac OS X 10.9 上使用 Swift 编写的屏幕保护程序,请将项目设置 Embedded Content Contains Swift Code 设置为 Yes

在代码级别,它将被视为两行:

EMBEDDED_CONTENT_CONTAINS_SWIFT = YES;

在您的 project.pbxproj 文件中。

【讨论】:

    【解决方案2】:

    检查您的项目设置的“OS X 部署目标”。它可能默认为您的开发机器正在运行的任何操作系统,但请仔细检查。如果要支持 10.9,则必须将此设置更改为 10.9:

    此外(这比其他任何事情都更重要),无论您使用什么部署目标,您都可以在代码中包含 10.10 API。因此,您还需要检查您正在调用的任何 Cocoa 方法的文档,以确保它们不是特定于 10.10。除非您使用的是较新的功能,否则这不太可能发生,但也需要牢记这一点。

    【讨论】:

    • 这是在 10.9 上创建的屏幕保护程序项目,它并没有自动更改为 10.10,因此,它一直在 10.9 上。而我使用的 API Screensaver 已经存在多年了。
    【解决方案3】:

    是的,Swift 可以在 OS X 10.9 上运行,但不能在更早的版本上运行。

    我在将屏幕保护程序移植到 Swift 时遇到了一些问题,主要是因为标题尚未“现代化”以适用于 Objective C 2.0。因此,getter 和 setter 不使用 @property 声明。

    【讨论】:

    • 你有在 Mavericks 中运行的 Swift 屏幕保护程序的小例子吗?我们仍然需要找到或制作这样的代码。
    • 我还没有将所有的 UI 设置移植到 Swift(我将尝试改进它),但你可以在这里找到我的工作:github.com/MaddTheSane/NonsenseSaver/tree/swiftVersion 请注意,我的目标是 10.10 ,但您最需要担心的是将屏幕保护程序中的EMBEDDED_CONTENT_CONTAINS_SWIFT 设置为YES
    猜你喜欢
    • 2014-12-13
    • 1970-01-01
    • 1970-01-01
    • 2014-12-13
    • 1970-01-01
    • 1970-01-01
    • 2015-09-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多