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

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

设置:

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

使用 Storyboards 进行布局,对象库中似乎没有 QLPreviewView 组件,因此我使用了自定义 View 对象并将类设置为 QLPreviewView。然后我设置约束以允许预览 View 随窗口框架一起调整大小。

然后我将类 QLPreviewView 的自定义 View 作为成员变量链接到 ViewController.swift 文件中。在 viewDidLoad() 方法中,我将 QLPreviewView 对象的 previewItem 添加到 QLPreviewItem 协议(protocol)的实现中。我还添加了一个导入 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 在非 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.
    }
    ...
}

另外,还要确保Interface Builder将preview属性连接到 View 。

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

10-09 08:05