(在OSX 10.9上开发,Xcode 6.1b)
如果我在AppController中声明IBOutlets,一切都很好.我在InterfaceBuilder中实例化一个对象,拖动它来形成一个插座,当我到达applicationDidFinishLaunching时,我的IBOutlets被填充,一切都很棒.
如果我更进一步抽象并在InterfaceBuilder(NSObject的子类)中实例化一个自定义控制器对象,并将我的一个对象声明为该类中的IBOutlet,那么它们就是零,每一个都是零.
我可以设置连接就好了,IB似乎确信它存在,'引用的出口'列表是正确的,但它不需要,我在文档之外找不到任何东西
它是隐式解包的,因为在从storyboard或xib文件初始化类之后,您可以假设插座已连接.
好吧,我在假设.
我的所有代码都是样板Xcode产品:
@IBOutlet弱var sceneController:NSArrayController!
我已检查并仔细检查并三重检查连接.我看过几十个iOS教程(虽然我找不到OSX的等价物)所有这些似乎都是主题的变化'是的,你可以在AppController以外的文件中完全声明一个插座,只需确保每个涉及的实例都存在'.
(在撰写本文时,'mac'文档使用了以UIButton等为特色的示例)
我没有想法.很明显,连接没有形成,大概是因为对象是以"控制器类优先,IBOutlets以后"之外的顺序实例化的,但是我如何强制连接呢?
有时在使用我的基于文档的 mac 应用程序(Xcode 10、Swift 4.2、macOS 10.13.5)时,我在控制台中收到以下错误:
_NSDocumentBasicAsyncOperation 0x60c000233c40 isFinished=YES 没有被它所在的队列启动
我理解当您使用异步操作时会发生这种情况(参见,例如,this question),但我不知道。这是 Cocoa 自己完成的事情,所以我的问题是我应该有多担心,我怎样才能找出这个错误的来源?我覆盖了 NSDocumentController 和 NSDocument 中的一些函数;我怀疑它是 NSDocument 中的东西(我在每个打开的文档中都会得到其中一个),但是我很困惑从哪里开始进行故障排除,并且对可能发生的事情感到好奇。
我想创建一个使用
这似乎是不可能的。该文件非常清楚地说明
NSPersistentDocument 不支持某些文档行为:文件包装器。[..]
这让我认为在 CoreData 中处理图像的常用方法 -带有“允许外部存储”的二进制数据并将它们保存到不同的位置,将 URL 存储在数据库中 - 不能与 NSPersistentDocument 一起使用。我希望我的用户能够对我的“文件”执行通常的 Finder 操作(复制、移动到外部存储、从外部备份恢复)并且需要我的所有数据都在一个包中。
文件存储的 SQL 版本在保存时会产生通常的三重堆栈 - .sqlite、.sqlite-shm、.sqlite-wal - 作为“文档”是无用的。
有没有我忽略的解决方案?(示例非常稀少;Big Nerd Ranch 示例也没有解决这个问题;Marcus Zarra 和 Objc.io 都没有触及 NSPersistentDocument)。
我有一个带有String属性和NSImage属性的'Thing'对象; Thing类有encodeWithCoder:和decodeWithCoder:方法,我可以使用NSKeyedArchiver/Unarchiver归档和解压缩[Thing]数组.
到现在为止还挺好.现在我想通过一系列方向扩展我的Thing类,其中'Direction'是以下枚举:
enum Direction{
case North(direction:String)
case East(direction:String)
case South(direction:String)
case West(direction:String)
}
Run Code Online (Sandbox Code Playgroud)
换句话说,我希望存储的数据是
thing1.directions: Direction = [.North("thing2"), .South("thing3")]
Run Code Online (Sandbox Code Playgroud)
(在一个更完美的世界中,我将使用对我的东西的直接引用而不仅仅是它们的名称,但我意识到这将很容易创建引用循环 - 在创建Thing之前无法设置对另一个Thing的引用 - 所以我会克制.我正在寻找一种快速而又脏的方法来保存我的应用数据并继续前进.)
由于我将需要其他地方的指示,这是一个单独的实体,而不仅仅是Thing类中的枚举.(不确定这是否有所不同.)
使我的Direction枚举符合NSCoding的最佳方法是什么?我能提出的最好的解决方法是创建一个[String:String]字典,其中"North"和"South"作为键,"thing2"和"thing3"作为值,并从中重构我的enum属性,但是有一个更好的方法?就此而言,是否有一种方法可以使元组符合NSCoding,因为现在(String,String)让我"不兼容协议"AnyObject"'错误.
非常感谢.