Der*_*rek 5 xcode cocoa storyboard swift osx-yosemite
问题:在设置窗口中布置的QLPreviewView对象的previewItem时获取线程1:EXC_BAD_ACCESS(code = 1,address = 0x18).
目标:创建一个带有文件内容预览和下面控件的应用程序,用于更改正在预览的文件的属性.预览必须与窗口大小相关联,并对窗口的大小进行反应.
建立:
使用Xcode 6.1.1我使用Swift和Storyboard创建了一个默认的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.
}
}
}
Run Code Online (Sandbox Code Playgroud)
设置preview.previewItem的行会在运行应用程序时获得顶部描述的EXC_BAD_ACCESS错误.
我已经成功创建了一个QLPreviewView并将其嵌入到一个窗口中,但是我没有使用故事板或约束就这样做了,所以它的大小和位置不是由窗口管理的,这就是我想要的.
内联类PreviewItem工作正常.我已经尝试将其切换到独立类,然后将其创建为变量,然后将QLPreviewView.previewItem设置为变量.这与设置为previewItem以内联方式执行此操作失败的方式相同.
内联类PreviewItem在非故事板情况下也可正常工作,文件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.
}
...
}
Run Code Online (Sandbox Code Playgroud)
还要确保该preview
属性已通过 Interface Builder 连接到视图。
归档时间: |
|
查看次数: |
308 次 |
最近记录: |