我正在学习斯威夫特.

这些天我主要在iOS工作,但我目前正在为OS X开发一个小项目.

在OSX上,我喜欢使用Cocoa绑定将我的模型中的值链接到UI元素.它节省了大量的胶水代码.

我正在编写一个程序,将Swift的性能与C / Objective-C的性能进行比较.我正在使用素数生成器作为测试项目.

我创建了一个Swift Struct ComputeSettings,它封装了在Swift和Objective-C中运行素数生成器的设置(和结果).结构看起来像这样:

struct ComputeResults
{
  var totalCalculated:  Int = 0
  var primesPerSecond:  Int = 0
  var totalTime:        NSTimeInterval = 0
}
struct ComputeSettings
{
  var totalToCalculate: Int = 10000000
  var swiftResults:     ComputeResults = ComputeResults()
  var objCResults:      ComputeResults = ComputeResults()
}

然后我在视图控制器中有一个ComputeSettings类型的实例变量:

class ViewController: NSViewController
{
  var theComputeSettings = ComputeSettings()
  var foo: Int = 12
  //...
}

在我的UI中,我有一个文本字段,允许用户输入要计算的素数的数量.在IB中,我选择字段,在实用程序区域中选择绑定选项卡,然后打开值绑定.我绑定到我的ViewController类.我输入了self.theComputeSettings.totalToCalculate的模型关键路径.

当我运行我的项目时,它失败并出现异常:

Failed to set (contentViewController) user defined inspected property
on (NSWindow): [ addobserver:
forKeyPath:@”theComputeSettings.totalToCalculate” options:256
context:0x0] was sent to an object that is not KVC-compliant for the
“theComputeSettings” property.

相反,如果我绑定到虚拟属性foo(因此模型键路径设置为self.foo)它完美地工作.在这种情况下,我看到我的文本字段显示我的值12.

有没有办法使用Swift结构并仍然可以使Cocoa绑定工作?我做了相当多的谷歌搜索,但找不到任何东西.

我当然可以用手动方式来做,并编写一堆粘合代码来将我的结构中的值安装到我的窗口视图中,但我更喜欢使用Cocoa绑定.这就是他们的目的.

您不能将Cocoa绑定与Swift结构一起使用.

Cocoa绑定系统是在Key-Value Observing之上实现的,Key-Value Observing是通过创建一个子类来拦截发送给被观察对象的set< Property>:消息来实现的. Swift结构不能有子类,也不一定使用消息或函数调用来设置结构字段,因此通常无法拦截Swift结构字段的设置.

该消息抱怨缺乏KVC合规性,因为键值编码定义了消息名称的set< Property> :(和< property> getter)约定.

macos – 如何使用针对Swift结构的Cocoa绑定的更多相关文章

  1. xcode – 上传到App Store时进行身份验证

    只需为现有安装/文件夹创建备份,这很重要,因为在(新)安装期间,Transporter将删除以前的安装:现在运行以下命令来更新Transporter:希望这有助于某人.

  2. 无法验证iOS应用(已获得有效证书)

    当切换到优胜美地时,我干净安装了我的Mac,现在我在将iOS提交到商店时遇到了问题.当我验证我的存档时,我不断收到“您的帐户已经拥有有效的iOS分发证书”.我已尝试从会员中心重命名和重新下载我的证书,但这不起作用.解决方法一个非常常见的“doh!”

  3. cocoa – Xcode如何决定首先显示哪个XIB

    当我在Xcode中创建一个新的cocoa项目时,它会创建一个带有Window的MainMenu.xib文件.我想将窗口分成MainWindow.xib并将其显示为主窗口–我该怎么做?如果我创建一个基于’文档’的应用程序–我看到两个xib,我注意到MyDocument.xib立即显示–但我不明白它在哪里被识别.似乎没有明确的代码,我不知道在哪里查看plist.如果我创建一个新文档,如何将其作为启动应用程序时显示的主窗口?

  4. Xcode:如何导出开发人员配置文件以便在另一台Mac上导入它

    我需要从我的旧Mac导出我的开发者配置文件并将其导入另一台Mac,因为我收到以下错误:我发现我可以从这里导出它:但在我的Mac上我有2个帐户,如果我点击导出帐户,我是否导出它们?就像导出用于签署iOS开发证书的私钥并将其导入新Mac一样?

  5. iOS从UIWebview内容创建pdf

    哪个是从webview内容中获取最佳质量pdf文档的最佳选择?

  6. 如何在Cocoa中使用Bindings CoreData实现iTunes风格的Source-List?

    让我们说,为了说明,我在Cocoa中编写了一个iTunes克隆应用程序,该应用程序由CoreData支持.为简化起见,假设有两个“部分”,“图书馆”,包括音乐,电影,广播等.第二部分称为“播放列表”,其中包含用户生成的播放列表.所以SourceList本身通常会用NSOutlineView实现,这通常很简单.源列表的“库”部分实际上并不包含用户生成的任何内容,只包含应用程序的“功能”(实质上),其中“播放列表”部分仅包含用户创建的自定义列表.如何用Bindings和CoreData做到这一点?

  7. macos – 使用Xcode 4在Mac OS X Lion上设置SDL

    我一直试图让一个超级简单的SDL程序工作.我正在使用MacOSXLion.我有SDL在SNowLeopard工作,但它似乎不想在狮子身上工作.到目前为止我有这个:当我尝试编译此代码时,它给了我这个错误:如果我取消注释当前评论的#ifdef内容,程序将编译,但随后会在SDL_SetVideoMode行上接收SIGABRT.我刚才在另一个程序中看到了这些注释的东西,我不确定我是否应该拥有它.我怎么能让这个工作?

  8. ios – 未在Mac上接收自定义记录区域的CloudKit推送通知

    这看起来只是OSX中的一个错误,但可以通过这个简单的更改来解决.

  9. ios4 – 在iOS模拟器和设备中测试NSFileProtectionComplete

    我锁定了模拟器,但是当我在Finder中双击文件时,文件仍然可读.解决方法iTunes不会从设备复制文件,除非它有您的密码或设备先前已被信任;这就是它如何解密数据.在Xcode8及更早版本中,模拟器使用主机文件系统,macOS当前不支持每个文件加密,就像iOS一样,因此在macOS上你无法在模拟器中测试它.

  10. xcode4 – 设置XCode 4工作区以为Mac和iOS构建库

    我正在尝试在XCode工作区内构建几个应用程序:一个应用程序将是一个iOS应用程序,另一个应用程序将是一个MacOSX应用程序.我希望在应用程序的两个版本中都包含一组特定的类.我正在努力弄清楚什么样的项目结构最能支持一些共享的代码,一些特定于iOS应用程序,一些特定于Mac应用程序.是否有一般的XCode或XCode4中的这种事情的最佳实践?我应该为共享代码创建一个库项目,并为该库的iOS和MacOSX版本创建2个不同的目标吗?

随机推荐

  1. Swift UITextField,UITextView,UISegmentedControl,UISwitch

    下面我们通过一个demo来简单的实现下这些控件的功能.首先,我们拖将这几个控件拖到storyboard,并关联上相应的属性和动作.如图:关联上属性和动作后,看看实现的代码:

  2. swift UISlider,UIStepper

    我们用两个label来显示slider和stepper的值.再用张图片来显示改变stepper值的效果.首先,这三个控件需要全局变量声明如下然后,我们对所有的控件做个简单的布局:最后,当slider的值改变时,我们用一个label来显示值的变化,同样,用另一个label来显示stepper值的变化,并改变图片的大小:实现效果如下:

  3. preferredFontForTextStyle字体设置之更改

    即:

  4. Swift没有异常处理,遇到功能性错误怎么办?

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  5. 字典实战和UIKit初探

    ios中数组和字典的应用Applicationschedule类别子项类别名称优先级数据包contactsentertainment接触UIKit学习用Swift调用CocoaTouchimportUIKitletcolors=[]varbackView=UIView(frame:CGRectMake(0.0,0.0,320.0,CGFloat(colors.count*50)))backView

  6. swift语言IOS8开发战记21 Core Data2

    上一话中我们简单地介绍了一些coredata的基本知识,这一话我们通过编程来实现coredata的使用。还记得我们在coredata中定义的那个Model么,上面这段代码会加载这个Model。定义完方法之后,我们对coredata的准备都已经完成了。最后强调一点,coredata并不是数据库,它只是一个框架,协助我们进行数据库操作,它并不关心我们把数据存到哪里。

  7. swift语言IOS8开发战记22 Core Data3

    上一话我们定义了与coredata有关的变量和方法,做足了准备工作,这一话我们来试试能不能成功。首先打开上一话中生成的Info类,在其中引用头文件的地方添加一个@objc,不然后面会报错,我也不知道为什么。

  8. swift实战小程序1天气预报

    在有一定swift基础的情况下,让我们来做一些小程序练练手,今天来试试做一个简单地天气预报。然后在btnpressed方法中依旧增加loadWeather方法.在loadWeather方法中加上信息的显示语句:运行一下看看效果,如图:虽然显示出来了,但是我们的text是可编辑状态的,在storyboard中勾选Editable,再次运行:大功告成,而且现在每次单击按钮,就会重新请求天气情况,大家也来试试吧。

  9. 【iOS学习01】swift ? and !  的学习

    如果不初始化就会报错。

  10. swift语言IOS8开发战记23 Core Data4

    接着我们需要把我们的Rest类变成一个被coredata管理的类,点开Rest类,作如下修改:关键字@NSManaged的作用是与实体中对应的属性通信,BinaryData对应的类型是NSData,CoreData没有布尔属性,只能用0和1来区分。进行如下操作,输入类名:建立好之后因为我们之前写的代码有些地方并不适用于coredata,所以编译器会报错,现在来一一解决。

返回
顶部