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

时间:2015-03-03 21:52:12

标签: xcode cocoa swift storyboard osx-yosemite

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

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

SETUP:

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

使用Storyboard进行布局时,对象库中似乎没有QLPreviewView组件,因此我使用了Custom View对象并将Class设置为QLPreviewView。然后我设置约束以允许预览视图使用窗口框架调整大小。

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

这是由Xcode生成的ViewController.swift的源代码,然后由我修改以添加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并将其嵌入到一个窗口中,但是我没有使用故事板或约束就这样做了,所以它的大小和位置不是由窗口管理的,这就是我想要的。 / p>

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

内联类PreviewItem在非故事板情况下也能正常工作,文件scan.jpeg按预期显示。

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

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

1 个答案:

答案 0 :(得分:0)

尝试将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.
    }
    ...
}

还要确保Interface Builder将preview属性连接到视图。