【问题标题】:QLPreviewView causing a EXC_BAD_ACCESS error at runtime when setting previewItem设置 previewItem 时,QLPreviewView 在运行时导致 EXC_BAD_ACCESS 错误
【发布时间】:2015-05-04 17:52:03
【问题描述】:

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

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

设置:

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

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

然后,我将 QLPreviewView 类的自定义视图作为成员变量链接到 ViewController.swift 文件中。在 viewDidLoad() 方法中,我将 QLPreviewView 对象的 previewItem 添加到 QLPreviewItem 协议的实现中。我还添加了一个导入 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 并将其嵌入到一个窗口中,但是我没有使用情节提要或约束,所以它的大小和位置不是由窗口管理的,这正是我想要的。

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

内联类 PreviewItem 在非情节提要的情况下也可以正常工作,并且文件 scan.jpeg 按预期显示。

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

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

【问题讨论】:

    标签: xcode cocoa swift storyboard osx-yosemite


    【解决方案1】:

    尝试将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 连接到视图。

    【讨论】:

    • 不幸的是,这具有相同的结果。 EXC_BAD_ACCESS 错误发生在 previewItem 分配时,就像在我的示例中一样。我还尝试将 PreviewItem 类放在 ViewControler 类之外,使其成为顶级类。这也是 preview.previewItem = PreviewItem() 行的错误。
    • 我有理由相信预览属性已通过界面生成器连接到视图,因为当它不是时,我会得到一个不同的错误:致命错误:在展开可选值时意外发现 nil
    • 我设置了一个项目并得到了同样的错误。实际上没有访问previewItem 属性,我在启动应用程序时得到了EXC_BAD_ACCESS。相反,如果我使用init(frame: NSRect) 通过代码创建了一个QLPreviewView 的实例,我没有收到错误消息。看起来 QLPreviewView 不支持故事板,但需要深入了解。
    • 在 macOS Mojave 中遇到同样的问题。 QLPreviewView 仅在直接实例化时有效,而不是从情节提要
    猜你喜欢
    • 2020-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-20
    • 2015-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多