xcode - QLPreviewView 在设置 previewItem 时在运行时导致 EXC_BAD_ACCESS 错误

标签 xcode cocoa swift storyboard osx-yosemite

问题:获取线程 1:EXC_BAD_ACCESS(代码=1,地址=0x18)时设置布局在窗口中的 QLPreviewView 对象的 previewItem。

目标:创建一个应用程序,其中包含文件内容预览和下方用于更改正在预览的文件的属性的控件。预览必须与窗口大小相关联,并对窗口大小的调整使用react。

设置:

使用 Xcode 6.1.1,我使用 Swift 和 Storyboards 创建了一个默认的 OS X Cocoa 应用程序。

使用 Storyboards 布局,Object Library 中似乎没有 QLPreviewView 组件,所以我使用了 Custom View 对象并将 Class 设置为 QLPreviewView。然后我设置约束以允许预览 View 随窗口框架调整大小。

然后我将 QLPreviewView 类的自定义 View 作为成员变量链接到 ViewController.swift 文件中。在 viewDidLoad() 方法中,我将 QLPreviewView 对象的 previewItem 集添加到 QLPreviewItem 协议(protocol)的实现中。我还添加了一个 import Quartz。

这是 ViewController.swift 的源代码,由 Xcode 生成,然后由我修改以添加 QLPreviewView 的设置。

//
//  ViewController.swift
//  PreviewTest
//
//  Created by Derek on 2015-03-02.
//  Copyright (c) 2015 Derek. All rights reserved.
//

import Cocoa
import Quartz

class ViewController: NSViewController {


    @IBOutlet var preview: QLPreviewView!

    override func viewDidLoad() {
        super.viewDidLoad()

        preview.previewItem = {final class PreviewItem : NSObject, QLPreviewItem {
                var previewItemURL: NSURL! {return NSURL(fileURLWithPath: "/Users/derek/Pictures/Scan.jpeg")}
                var previewItemTitle: String! {return "Test" }
            }
            return PreviewItem()
        } ()

        // Do any additional setup after loading the view.
    }

    override var representedObject: AnyObject? {
        didSet {
        // Update the view, if already loaded.
        }
    }


}

设置 preview.previewItem 的行会在应用程序运行时出现顶部描述的 EXC_BAD_ACCESS 错误。

我已经成功创建了一个 QLPreviewView 并将其嵌入到一个窗口中,但是我没有使用 Storyboard或约束就做到了,所以它的大小和位置不受窗口管理,这正是我想要的。

内联类 PreviewItem 工作正常。我试过将它切换到一个独立的类,然后将它创建为一个变量,然后将 QLPreviewView.previewItem 设置为该变量。这与设置为 previewItem 以内联方式执行失败的方式相同。

内联类 PreviewItem 在 Non-Storyboard 情况下也能正常工作,文件 scan.jpeg 会按预期显示。

其他 UI 对象,如文本字段,当我以类似方式设置它们时工作正常。

我希望找出我在这里做错了什么以及如何纠正它。或者关于如何以不同方式实现此目标的建议。

最佳答案

尝试将 PreviewItem 定义为嵌套类而不是内联定义。 JavaScript 可能会像您的程序一样使用 () 定义和调用它,但我认为在 Swift 中嵌套类更为通用。

class ViewController: NSViewController {
    private final class PreviewItem : NSObject, QLPreviewItem {
        var previewItemURL: NSURL! {return NSURL(fileURLWithPath: "/Users/derek/Pictures/Scan.jpeg")}
        var previewItemTitle: String! {return "Test" }
    }

    @IBOutlet var preview: QLPreviewView!

    override func viewDidLoad() {
        super.viewDidLoad()

        preview.previewItem = PreviewItem()

        self.view.addSubview(preview)
        // Do any additional setup after loading the view.
    }
    ...
}

还要确保 preview 属性已通过 Interface Builder 连接到 View 。

关于xcode - QLPreviewView 在设置 previewItem 时在运行时导致 EXC_BAD_ACCESS 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28842650/

相关文章:

xcode - 如何在 Interface Builder 中配置 NSTreeController

swift - 如何从 Xcode 项目(Cocoa App)从 Mac 打开应用程序

swift - 如何以编程方式并排捕捉 2 个窗口( Split View)

swift - 类类型属性不应该有 static 关键字吗?

iOS Flip UIView 无阴影

ios - NSDateFormatter 总是返回 nil

ios - 安装后如何定位Xcode(Xcode beta)?

iOS5 Facebook 整合

xcode - PackageMaker 错误无法将资源复制到 en.lproj

ios - Xcode:WebView 在 endRefreshing() 之后刷新/重新加载